文章目录
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。
高阶操作
一、 上、下采样
原图:
import cv2
face = cv2.imread('face.jpg',cv2.IMREAD_GRAYSCALE)
face = cv2.resize(face,dsize=(820,820))
cv2.imshow('face',face)
cv2.waitKey(0)
1. 上采样
上采样:图像的放大
过程:在原始图像的每个像素的右侧和下侧分别插入零值列和零值行,高斯滤波处理图片填值,分辨率并不会真正提高
face_up_1 = cv2.pyrUp(face)
cv2.imshow('face_up_1',face_up_1)
cv2.waitKey(0)
face_up_2 = cv2.pyrUp(face_up_1)
cv2.imshow('face_up_2',face_up_2)
cv2.waitKey(0)
2. 下采样
下采样:从一个高分辨率大尺寸的图像中构建一个金字塔的下一层,即图像的尺寸变小,分辨率降低
过程:删去图片中的偶数行和偶数列,进行二倍下采样,最后为原图的四分之一
face_down_1 = cv2.pyrDown(face)
cv2.imshow('face_down_1',face_down_1)
cv2.waitKey(0)
face_down_2 = cv2.pyrDown(face_down_1)
cv2.imshow("face_down_2",face_down_2)
cv2.waitKey(0)
3. 恢复原图
# 恢复原图
# 对已经下采样的图片进行上采样,但是由于上采样是以高斯方法填充,所以与原图还是有区别的
face_down_1_up = cv2.pyrUp(face_down_1)
face_down_2_up = cv2.pyrUp(face_down_2)
cv2.imshow('face_down_1_up',face_down_1_up)
cv2.imshow('face_down_2_up',face_down_2_up)
cv2.waitKey(0)
# 进行下采样再上采样之后,与原图的差值区别
L0 = face - face_down_1_up
L1 = face_down_1 - face_down_2_up
fuyuan = face_down_1_up + L0
cv2.imshow('L0',L0)
cv2.imshow('L1',L1)
cv2.waitKey(0)
cv2.imshow('fuyuan',fuyuan)
cv2.waitKey(0)
二、 直方图
直方图是一种统计图表,用于展示图像中像素强度(对于灰度图像)或颜色(对于彩色图像)的分布情况。通过查看直方图,我们可以获得关于图像亮度、对比度、颜色分布等方面的直观信息,这些信息对于后续的图像处理和分析任务至关重要。
1. plt.hist()绘图
phone = cv2.imread('../phone.png',cv2.IMREAD_GRAYSCALE)
# 将图像转化为一维数组,numpy中的ravel()函数,将多维数据拉成一维数组
a = phone.ravel()
# 绘制直方图
plt.hist(a,bins = 256)
# 显示直方图
plt.show()
参数:
-- a:一维数组,即图像的像素值组成的数组
-- bins:指定直方图的条数,即灰度级的数量
2. cv2.calcHist()绘图
- 对于灰度图绘制:
phone = cv2.imread('../phone.png',cv2.IMREAD_GRAYSCALE)
phone_hist = cv2.calcHist([phone],[0],None,[16],[0,256])
plt.plot(phone_hist)
plt.show()
参数:
-- [phone]:这是第一个参数,表示要计算直方图的图像数组。在这个例子中,phone是一个图像变量,它被放在列表中作为参数传递。
-- [0]:这是第二个参数,指定了要计算直方图的通道。对于灰度图像,它通常是[0],因为灰度图像只有一个通道。如果phone是一个彩色图像 (如BGR格式),并且你想要计算蓝色通道的直方图,则这个参数应该是[2](因为B是第一个通道,索引从0开始,但按照BGR的顺序,蓝色 是第三个元素)。但在这个例子中,由于我们假设phone是灰度图像,所以使用[0]。
-- None:这是第三个参数,用于指定掩码。掩码是一个与原图像大小相同的单通道图像,用于指定哪些像素应该被包括在直方图的计算中。在这个 例子中,没有使用掩码,所以传递了None。
-- [16]:这是第四个参数,指定了直方图的bin数目。在这个例子中,直方图被分成了16个bin,这意味着像素值的范围(在这个例子中是0到 256)被分成了16个等宽的区间,每个区间对应直方图中的一个bin。
-- [0,256]:这是第五个参数,指定了像素值的范围。
- 彩图绘制:
# 绘制每个颜色的直方图
img = cv2.imread('../phone.png')
color = ('b','g','r')
for i,col in enumerate(color):
hister = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(hister,color = col)
plt.show()
三、 mask掩膜
掩膜(Mask)是一种用于控制或限制某些操作或访问特定区域的技术。
1. 原图
phone = cv2.imread('../phone.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('phone',phone)
cv2.waitKey(0)
2. 创建黑白图像
mask = np.zeros(phone.shape[:2],np.uint8) # 创建黑白图像,用于制作mask
mask[50:350,100:470] = 255
cv2.imshow('mask',mask)
cv2.waitKey(0)
3. 掩膜
cv2.bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作:1&1=1;1&0=0;0&1=0;0&0=0
cv2.bitwise_and(src1,src2,dst=None,mask=None)
参数:
-- src1,src2:为输入图像或标量,标src1和src2相与
-- dst:可选输入变量,如果需要使用非None则要先定义,且其大小与输入变量相同
-- mask:图像掩膜,可选参数,用于指定要更改的输出图像数组的元素。
mask为0的值,src1和src2相与的值都为0
非0的值,为src1和src2相与的值
phone_mask = cv2.bitwise_and(phone,phone,mask=mask)
cv2.imshow('phone_mask',phone_mask)
cv2.waitKey(0)
4. 绘制曲线图
# 使用cv2.calcHist()绘制曲线图
phone_hist_mask = cv2.calcHist([phone],[0],mask,[256],[0,256])
plt.plot(phone_hist_mask)
plt.show()
四、直方图均衡化
1. 直方图均衡化
直方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。直方图的均衡化通过将图像的像素值分布均匀化来实现这一目标。
在python opencv中,可以使用cv2.equalizeHist()函数来实现直方图均衡化,该函数将输入图像转化为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。
women = cv2.imread('women.png',cv2.IMREAD_GRAYSCALE)
women_equalize = cv2.equalizeHist(women)
plt.hist(women_equalize.ravel(),bins=256)
plt.show()
# 横向拼接,将多个数组按水平方向(列顺序)堆叠成一个新的数组
res = np.hstack((women,women_equalize))
cv2.imshow('women_equalize',res)
cv2.waitKey(0)
2. 自适应直方图均衡化(局部直方图处理)
自适应直方图均衡化(局部直方图处理),通过局部调整图像的直方图分布来提升图像的对比度和细节表现力,当需要保存细节特征,需要做局部处理。
cv2.createCLAHE(clipLimit,tileGridSize)
参数:
clipLimit:颜色对比度的阈值,默认值为8
tileGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值(8,8)
clahe = cv2.createCLAHE(clipLimit=1,tileGridSize=(16,16)) # 通过类创建了一个局部均衡化对象
women_clahe = clahe.apply(women)# 将CLAHE算法应用于women图像上,并返回均衡化后的图像
res = np.hstack((women,women_equalize,women_clahe))
cv2.imshow('women_equalize',res)
cv2.waitKey(0)
总结
本篇介绍了OpenCV中的部分高阶操作:
- 上、下采样:本质上时调整图片的大小。
- 直方图:展示图像中像素强度(对于灰度图像)或颜色(对于彩色图像)的分布情况。
- mask掩膜:控制或限制某些操作或访问特定区域。
- 直方图均衡化:通过增加图像的对比度和亮度来改善图像的质量。