用 Image 和 cv2 库读取 BMP 图 像

这篇具有很好参考价值的文章主要介绍了用 Image 和 cv2 库读取 BMP 图 像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本次内容中包含了图片的读取和写入,以及“图片融合”、‘图片拼接’、‘图片的灰度直方图展示’

1、 BMP 图像的读

使用深度为8位24位的格式为bmp的图片,存放在“file”文件夹,实现位数为8和24的BMP图像读取和存储,并绘制其对应的灰度直方图。

(1)导入标准库numpy,赋给对象np,用于数据计算和处理。
(2)导入可视化模块matplotlib.pyplot,赋给对象plt,用于绘制可视化图像。
(3)导入第三方库matplotlib,用于调用库中的图像处理函数。
(4)导入标准库os,用于文件和目录操作。
(5)从struct模块导入unpack库,struct模块用于解析字节数据,unpack库用于将字节流转换成python数据类型,返回值为元组。
 # 标准库,用于数据计算和处理
import numpy as np
 # 可视化模块,用于绘制可视化图像
import matplotlib.pyplot as plt
 # 第三方库
import matplotlib
 # 标准库,用于文件和目录操作
import os
 # struct模块用于解析字节数据,unpack库用于将字节流转换成python数据类型,返回值为元组
from struct import  unpack
(6)从第三方图像处理模块PIL导入Image库,用于读取图像。
(7)导入cv2库,用于读取图像。
(8)使用Image库的open函数读取24位的BMP图像,赋值给变量im_24;使用show()方法和可视化模块的imshow函数显示图片,其中,运用可视化模块是为了在输出框输出图片;使用save()方法保存图片,设置图片名为“im_24.jpg”。
(9)使用cv2库的imread函数读取8位的BMP图像,赋值给变量im_8;使用cv2库的imshow函数显示图像,设置窗口名称为“im_8”;使用可视化模块的figure函数创建画布,imshow函数输出图片;使用cv2库的imwrite函数保存图片,设置图片名为“im_8.jpg”。
(10)创建一组for循环,循环对象为range(4),循环变量为i。
①通过plt.subplot(1,4,i+1)函数创建4个子图。
②通过plt.imshow(pictures[i],'gray')函数展示灰度图。
③通过plt.title(titles[i]), plt.xticks([]), plt.yticks([])函数设置图片的标题,并去除横纵坐标轴上的数字坐标。
(11)通过plt.show()函数展示绘制的子图。
from PIL import Image  # 用于读取图像
import cv2  # 用于读取图像
# 读取24位BMP
im_24 = Image.open('./file/24bits.bmp')
#显示图像
plt.imshow(im_24)
#以jpg格式进行存储
im_24.save('im_24.jpg')

# 读取8位BMP
im_8 =  cv2.imread('./file/8bits.bmp')
#显示图像
cv2.imshow('im_8',im_8)
# 设置图片展示时间
cv2.waitKey()
# 释放内存
cv2.destroyAllWindows()

plt.figure()
plt.imshow(im_8)
cv2.imwrite('im_8.jpg',im_8)
# 设置图片标题
titles = ['24bits','8bits']
pictures = [im_24,im_8]
 # 灰度图、idc变换图、高频信息图、增强高频信息后的图

# 设置画布大小
plt.figure(6, figsize=(16, 8))
for i in range(2):
    # 绘制子图
    plt.subplot(1,2,i+1)
    # 绘制图片
    plt.imshow(pictures[i],'gray')
    # 设置标题,并去除横纵坐标轴上的数字坐标
    plt.title(titles[i]), plt.xticks([]), plt.yticks([])
plt.show()
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
(12)对“24bits.bmp”和“8bits.bmp”进行读取并显示其直方图。
(1)定义Rgb2gray函数
#定义Rgb2gray函数
def Rgb2gray(image):
    h = image.shape[0]
    w = image.shape[1]
    grayimage  = np.zeros((h,w),np.uint8)
    for i in tqdm(range(h)):
        for j in range(w):
            #Gray = R*0.299 + G*0.587 + B*0.114.
            gray =h*0.299+w*0.587
    return grayimage
(2)导入图片画直方图
from PIL import Image
from pylab import *
import cv2
from tqdm import tqdm
# 读取24bits.bmp图像到数组中,并灰度化
image = cv2.imread('./file/24bits.bmp')
im = array(Image.open('./file/24bits.bmp').convert('L'))
# 直方图图像
# flatten可将二维数组转化为一维
hist(image.flatten(), 128)
# 显示
show() 

# 读取8bits.bmp图像到数组中,并灰度化
image = cv2.imread('./file/8bits.bmp')
im = Rgb2gray(image)
# 直方图图像
# flatten可将二维数组转化为一维
hist(image.flatten(), 128)
# 显示
show()
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档

bmp图像的写

(1)从第三方图像处理模块PIL导入Image库,用于调用图像处理方法。
(2)导入可视化模块matplotlib.pyplot,赋给对象plt,用于显示图像。
(3)导入标准库os,用于文件和目录操作。
(4)导入cv2库,用于图像处理和操作。
(5)使用Image库的open函数读取本地真彩色图片,即深度为24位的BMP图,赋值给变量im_24。
(6)使用可视化模块的imshow函数显示图片。
# 用于调用图像处理方法
from PIL import Image
 # 用于显示图像
import matplotlib.pyplot as plt
# 用于文件和目录操作
import os
# 用于图像处理和操作
import cv2
# 读取本地真彩色图片
im_24 = Image.open('24.bmp')
# 显示图片
plt.imshow(im_24)
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
(7)使用对象im_24的convert()方法实现图像格式转换,设置参数为“L”,实现将图像转换为灰色图像,每个像素用8个字节表示,0表示黑,255表示白,其他数字表示不同的灰度,赋值给变量Lim。
(8)使用可视化模块的imshow函数显示图像,设置参数“gray”,实现灰度图显示,save()方法保存图像,命名为“24bit_灰度.jpg”。
(9)使用convert函数,设置参数为“1”,实现将图像转换为二值图像,非黑即白,每个像素用8个字节表示,0表示黑,255表示白,赋值给变量Bim;使用可视化模块的figure函数创建画布,将图像进行显示并保存,命名为“24bit_二值.jpg”。
(10)定义循环,使用range函数进行遍历,设置值为256,当值小于所定义的变量threshold,向列表填充值“0”,否则填充值“1”。
(11)使用对象Lim的point()方法,设置参数为“table”和“1”,实现通过带有常量阈值的转换表将图像转换为二进制图像;创建画布,将图像进行显示并保存,命名为“24bit_二进制.png”。
# 转换为灰度图像(8位)# 灰度化,8位像素,黑白
#显示为灰度图像
Lim = im_24.convert('L')
plt.figure(figsize=(4,4))
plt.imshow(Lim,'gray')
#matplotlib.pyplot.imshow(X, cmap=None),cmap:颜色图谱(colormap), 默认绘制为RGB(A)颜色空间
# 保存的灰度化图片,jpg形式
im_24.save('24bit_灰度.jpg')
# 转换为二值图像(1位)# 1位像素,黑白,每个字节一个像素存储
Bim = im_24.convert('1')
#创建第二个figure
plt.figure(figsize=(4,4))
#显示图像
plt.imshow(Bim)
#保存为jpg格式图片
Bim.save('24bit_二值.jpg')
# 设置一个带有常量阈值的转换表
threshold = 185
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
# 通过表格转换为二进制图像
img = Lim.point(table,'1')
#创建第三个figure
plt.figure(figsize=(4,4))
#显示灰度图像
plt.imshow(img,'gray')
#保存png格式图片
img.save('24bit_二进制.png')
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
(12)构造拼接函数
def image_compose():
  # 创建一个新图
    to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(1, IMAGE_ROW + 1):
        for x in range(1, IMAGE_COLUMN + 1):
            from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
                (IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)
            to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
    plt.imshow(to_image)
    return to_image.save("拼接结果.jpg")  # 保存拼接之后的结果图
(13)定义参数,调用拼接函数
# 图片集地址
IMAGES_PATH = 'img/'
# 图片格式
IMAGES_FORMAT = ['.bmp','.jpg']
# 每张小图片的大小为256
IMAGE_SIZE = 256 
# 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_ROW = 2
# 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_COLUMN = 2
# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
               os.path.splitext(name)[1] == item]
print(image_names)
# 简单的对于参数的设定和实际图片集的大小进行数量判断
l=len(image_names)
if l!=IMAGE_SIZE*IMAGE_COLUMN:
    print('错误')
image_compose()  # 调用函数
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
(14)图片融合叠加
import cv2  # 用于图像处理和操作
#采用cv2读取24.bmp图像
img1 = cv2.imread('24.bmp')
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
#采用cv2读取1.jpg图像
img2 = cv2.imread('1.jpg')
# 调整大小为(300,300)
img2 = cv2.resize(img2,(300,300))
# 获取矩阵行、列和维度
    #rows = img2.shape[0]
    #cols = img2.shape[1]
    #channels = img2.shape[2]
rows,cols,channels = img2.shape
roi = img1[0:rows,0:cols]
dst = cv2.addWeighted(img2, 0.9, roi, 0.1, 0)#图像融合
dst1 = img1.copy()#对原图像进行拷贝
dst1[0:rows,0:cols] = dst

plt.imshow(dst1)
plt.show()

cv2.imshow('dst',dst)#查看融合结果
cv2.imshow('reusult',dst1)#显示处理后的结果
#保存为reusult.jpg
cv2.imwrite('reusult.jpg',dst1)
# 设置图片展示时间
cv2.waitKey()
# 释放内存
cv2.destroyAllWindows()
"""
cv2.imshow()和plt.imshow()的区别
如果需要展示读入的图像,或者展示对读入图像进行一系列操作后的图像时,使用cv2.imshow()
如果不需要展示原始图像,而是绘制一张新的图像,使用plt.imshow()
注意
opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,
需要进行通道转换。
在展示灰度图像时,cv2.imshow(‘gray’, gray)
plt.imshow(gray,cmap=‘gray’), plt.title(‘gray’)
"""
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档

整个代码敲下来,也花费我不少时间,总结了一下一些难点(仅针对我自己):

1.图像的融合叠加

在思考这一部分的时候完全是懵的,在网上也找了许多资料,但都没有解决工作问题,后来是看到以前朋友写的代码才得以解决。

首先是对cv2.addWeighted((img2, 1, roi, 0.1, 0)函数的理解

img2 权重为0.9,roi 权重为0.1,补偿量为0。补偿量的作用为亮度调节。

其次呢roi = img1[0:rows,0:cols]这一行代码我将其都运行出来进行对比

cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档
cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档

通过运行结果可以发现

roi是图像img1同等大小的一个角

dst是roi与img2融合的结果

而最后的结果是经过dst1(就是img1)拷贝dst(融合好的)的r,g,因此就会出现图片上的情况

cv2读取bmp,数字图像处理,python,opencv,计算机视觉,Powered by 金山文档

第二个问题就是上面颜色的问题

我在同时使用plt.show和cv2.imshow展示出来的效果不一样,查询后发现是其两个默认通道不同

opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,需要进行通道转换。文章来源地址https://www.toymoban.com/news/detail-713638.html


到了这里,关于用 Image 和 cv2 库读取 BMP 图 像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

    双边滤波(BilateralFiltering)是一种图像处理滤波技术,用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同,双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。这使得双边滤波能够有效地去除噪声,同时保持图像的细节和边缘。

    2024年02月14日
    浏览(27)
  • opencv 31-图像平滑处理-方框滤波cv2.boxFilter()

    方框滤波(Box Filtering)是一种简单的图像平滑处理方法,它主要用于去除图像中的噪声和减少细节,同时保持图像的整体亮度分布。 方框滤波的原理很简单:对于图像中的每个像素,将其周围的一个固定大小的邻域内的像素值取平均,然后将这个平均值赋值给当前像素。这

    2024年02月14日
    浏览(32)
  • perl语言读取文件夹中所有的bmp图像

    工作中会经常遇到测试所有图像的需求,使用perl语言进行bmp图像读入,示例代码如下: 请确保将 /path/to/folder 替换为实际的文件夹路径,其中包含你要读取的BMP图像文件。代码遍历文件夹中的每个文件,使用正则表达式过滤出BMP图像文件,然后可以在循环中对每个图像文件执

    2024年02月16日
    浏览(34)
  • opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

    图像平滑处理(Image Smoothing)是一种图像处理技术,旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像,以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括: 均值滤波(Mean Filtering) :用图像中像素周围区域的平

    2024年02月01日
    浏览(28)
  • opencv(15) 图像平滑处理之二:cv2.GaussianBlur()高斯滤波

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 高斯模板是通过对二维高斯函数进行采样(高斯模糊的卷积核里的数值满足高斯分布)、量化并归一化得到的,它考虑了邻域像素位置的影响,距离当前被平滑像素越近的点,加权系数越大

    2024年02月10日
    浏览(34)
  • opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()

    2D卷积是一种图像处理和计算机视觉中常用的操作,用于在图像上应用滤波器或卷积核,从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中,图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动,对每个局部区域进行元素级别的乘法和累加

    2024年02月14日
    浏览(32)
  • Python中使用OpenCV读取灰度图像时遇到的错误:module ‘cv2‘ has no attribute ‘CV_LOAD_IMAGE_GRAYSCA...

    Python中使用OpenCV读取灰度图像时遇到的错误:module ‘cv2’ has no attribute ‘CV_LOAD_IMAGE_GRAYSCALE’。 OpenCV是一款广泛应用于计算机视觉领域的开源计算机视觉库,它可以实现图像处理、分析、识别等功能。而在使用OpenCV读取灰度图像时,可能会出现上述错误。 这个错误发生的原

    2024年02月16日
    浏览(41)
  • 数字图像处理 --- 相机的内参与外参(CV学习笔记)

    Pinhole Camera Model(针孔相机模型)         针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便,我们可以把 物理成像平面 (image plane)上的图像移到 实际场景 (3D object)和 焦点 (focal point)之间,把他想象成

    2024年02月12日
    浏览(30)
  • 《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。 本章内容

    2024年02月09日
    浏览(41)
  • (P4)Python plt显示和保存图像(cv2、Image)

    对这篇博客内容的最最简要的总结,便于快速抓要点 以下是一张图中包含多张小图 的三种不同写法的汇总和拆解。 汇总 ⭐ 写法一 写法二 写法三 已知的读取图片方式有两种:cv2、Image,初略讲解如下,有需要更多讲解的再单独整合。 写法一 cv2 参考资料 opencv 因为历史原因

    2024年01月24日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包