OpenCV——总结《图像处理-1》

时间:2023-01-31 17:53:54

1.HSV

  • H - 色调(主波长)。
  • S - 饱和度(纯度/颜色的阴影)。
  • V值(强度)
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

2.图像阈值

函数介绍:

ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
    type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

3.图像平滑

3.1均值滤波

在进行均值滤波的时候要考虑需要对周围多少个像素去平均值,即确定核 的大小,通常情况下都是以当前像素点为中心,读行数和列数相等的一块区域内的所有像素点求平均。将计算得到的结果作为该点的像素。

dst=cv2.blur(src,ksize,anchor,borderType)

  • dst是返回值,表示进行均值滤波后得到的结果
  • src是需要处理的图像,即原始图像,图像的深度有CV_8U,CV_16U,CV16S,CV32F,CV_64F.
  • ksize是核 的大小,
  • anchor是锚点,一般情况该值直接默认即可
  • borderType是边界样式,该值决定以何种方式处理边界,一般情况下不需要考虑该值的取值,直接默认即可。
# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

3.2方框滤波

可以*选择是否对均值滤波结果进行归一化,即可以*选择滤波结果是邻域像素值之和的平均值还是邻域像素值之和,如果不进行归一化,则效果和均值滤波一样

dst=cv2.boxFilter(scr,ddepth,ksize,anchor,normalize,borderType)

  • ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度
  • Normalize表示是否需要进行归一化(0/1),1表示需要,0表示不需要进行归一化

3.3高斯滤波

在均值滤波中,其邻域内每个像素的权重都是一样的,在高斯滤波中,中心点的权重值加大,远离中心点的权重值减少,在此基础上计算邻域内各个像素值不同权重的和。
OpenCV——总结《图像处理-1》
dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)

  • dst为高斯滤波后得到的结果

  • src是需要处理的图像,

  • ksize是滤波卷积核。需要注意的是滤波核 的值必须是奇数

  • sigmaX是卷积在水平方向的标准差,或者X方向求导

  • sigmaY是卷积在垂直方向的标准差,或者说Y方向上

  • bordenType是边界类型

3.4中值滤波

中值滤波就是将当前像素点及其邻域内的像素点排序后取中间值作为当前值的像素点。

总结:
相比原始图像,高斯滤波处理后的图像模糊了一些,但是相对于均值滤波来说,要好一些,这是因为高斯滤波卷积核在中心点的权重更高。
在中值滤波处理中,噪声成分很难被选中,所以可以在几乎不影响原有图像的情况下去除所有的噪声,但是由于需要进行排序等操作,中值滤波需要的运算较大。中值滤波对椒盐噪声去除效果较明显。

4.形态学-腐蚀操作(腐蚀 - 黑进白退)

形态学

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像/灰度图像(就只有0和255)进行操作。它需要输入两个操作,一个是原始图像,另一个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀,它们的变体构成了开运算、闭运算和梯度等。简言之,形态学操作其实就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖",注意腐蚀和膨胀是针对图片中的白色部分。

腐蚀的效果是把图片"变瘦",其原理是在原图的小区域内取局部最小值。因为是二值化图,只有 0 和 255,所以小区域内有一个是 0 该像素点就为 0:(将白色内容变小)
OpenCV——总结《图像处理-1》

5.形态学-膨胀操作(膨胀 - 白进黑退)

膨胀与腐蚀相反,取的是局部最大值,效果是把图片"变胖"。OpenCV 中用 cv2.dilate() 函数进行腐蚀,只需要指定核的大小即可:

dilation = cv2.dilate(img, kernel)

6.开运算与闭运算

开运算:先腐蚀后膨胀,可用以消除黑色背景中的白点杂质

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

闭运算:先膨胀后腐蚀,可用以消除白色前景中的黑点杂质

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

OpenCV——总结《图像处理-1》

7.梯度运算

形态学梯度:膨胀图减去腐蚀图 (dilation - erosion),得到物体轮廓。

  • 基本梯度:基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,成为梯度图像。也是 opencv 中支持的计算形态学梯度的方法,而此方法得到的梯度又被成为基本梯度。
  • 内部梯度:用原图像减去腐蚀后的图像得到的差值图像,称为图像的内部梯度。
  • 外部梯度:原图像膨胀后减去原图像得到的差值图像,称为图像的外部梯度。
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8) 
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

8.礼帽与黑帽

  • 顶帽:原图减去开运算后的图 (src - opening)。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
  • 黑帽:闭运算后的图减去原图 (closing - src)。
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

连接:
https://blog.csdn.net/ONEFPGA/article/details/125255288
https://blog.csdn.net/qq_41731861/article/details/123919662