python_opencv(cv2)模块+灰度图二值化及降噪处理

1.安装:

网上说的那些,pip install cv2, opnecv。

全!都!是!坑!爹!的!

正确的操作方式如下:

pip install opencv-python

2.具体用法:

长期更新,学到哪写到哪。ps:也有可能不更了

基本头文件:

import cv2
import numpy as np

读取文件: 

lenna = cv2.imread("lenna.png")
#读取图片
#lenna为一个3维数组。具体代表含义如下
row, col, channel = lenna.shape  
#返回像素高度,像素宽度,和通道数一般为3

图片如下:

 python_opencv(cv2)模块+灰度图二值化及降噪处理_第1张图片

内容1:(将图像处理为灰度or二值图)

我们日常的环境通常获得的是彩色图像,很多时候我们常常需要将彩色图像转换成灰度图像。也就是3个通道(RGB)转换成1个通道。

#用一个二维数组表示每一个点的灰度
lenna_gray = np.zeros((row, col))
for r in range(row):
    for l in range(col):
        lenna_gray[r, l] = 1 / 3 * lenna[r, l, 0] + 1 / 3 * lenna[r, l, 1] + 1 / 3 * lenna[r, l, 2]
#此方法为平均值法
#除此之外还有其他多种方式将彩色图处理为灰度图

lenna_gray[r, l] = 0.11 * lenna[r, l, 0] + 0.59 * lenna[r, l, 1] + 0.3 * lenna[r, l, 2]
#加权平均值法

python_opencv(cv2)模块+灰度图二值化及降噪处理_第2张图片

在处理为单通道的灰度图后,我们就可以将其开始处理,使其变为只含有灰度0和255的“真”灰度图像。因为0代表黑色,255代表白色。我们设定一个阈值T,当某像素点的灰度值大于T时,设定该像素点的值为255,当小于T时,设定为0。

lenna_binary = np.zeros_like(lenna_gray)
#zeros_like表示生成一个维度同lenna_gray一样的全为0的张量
threshold = 100
for r in range(row):
    for l in range(col):
        if lenna_gray[r, l] >= threshold:
            lenna_binary[r, l] = 255
        else:
            lenna_binary[r, l] = 0

cv2.imshow("lenna_binary", lenna_binary.astype("uint8"))
cv2.waitKey()

二值图结果如下:

python_opencv(cv2)模块+灰度图二值化及降噪处理_第3张图片

内容2:降噪处理方法

上面的这张图可能看到,像周围的一些细节很丰富,小的黑白点交错。但是,这些“细节”是我们在真正使用时,所不需要的,会影响我们对主要特征的提取,因此我们一般都要进行降噪处理。

关于降噪,我们有好几种方法去进行操作:

1.将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域。

在OpenCV中,可以通过blur函数做到这一点。

result = cv2.blur(image,(5,5))

#上为均值模糊去噪方法。周围的都为均值
#又称为低通滤波

gaussianResult = cv2.GaussianBlur(img,(5,5),1.5)

#上为高斯模糊去噪方法。在某些情况下,需要对一个像素的周围的像素给予更多的重视。因此,可通过分配权重来重新计算这些周围点的值。
#(5,5)不可以随意指定,只能指定1,3,5,7.....等数字

处理好之后为新的3维张量。

python_opencv(cv2)模块+灰度图二值化及降噪处理_第4张图片

平滑处理后的灰度图如上所示。

低通滤波与高斯滤波的不同之处在于:低通滤波中,滤波器中每个像素的权重是相同的,即滤波器是线性的。而高斯滤波器中像素的权重与其距中心像素的距离成比例。

除此之外,还有一种去噪方法为中值滤波器。(主要用来处理图像中的椒盐现象)

椒盐现象(图像中的黑白噪声)图:

python_opencv(cv2)模块+灰度图二值化及降噪处理_第5张图片

函数返回处理结果,第一个参数是待处理图像,第二个参数是孔径的尺寸,一个大于1的奇数。比如这里是5,中值滤波器就会使用5×5的范围来计算。即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。
如果在某个像素周围有白色或黑色的像素,这些白色或黑色的像素不会选择作为中值(最大或最小值不用),而是被替换为邻域值。

result = cv2.medianBlur(image,5)

通过降噪以后进行二值化得出处理后的结果图

python_opencv(cv2)模块+灰度图二值化及降噪处理_第6张图片

除去了不必要的细节保留了绝大部分主特征。

 

你可能感兴趣的:(python_opencv(cv2)模块+灰度图二值化及降噪处理)