网上说的那些,pip install cv2, opnecv。
全!都!是!坑!爹!的!
正确的操作方式如下:
pip install opencv-python
长期更新,学到哪写到哪。ps:也有可能不更了
基本头文件:
import cv2
import numpy as np
读取文件:
lenna = cv2.imread("lenna.png")
#读取图片
#lenna为一个3维数组。具体代表含义如下
row, col, channel = lenna.shape
#返回像素高度,像素宽度,和通道数一般为3
图片如下:
内容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]
#加权平均值法
在处理为单通道的灰度图后,我们就可以将其开始处理,使其变为只含有灰度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()
二值图结果如下:
内容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维张量。
平滑处理后的灰度图如上所示。
低通滤波与高斯滤波的不同之处在于:低通滤波中,滤波器中每个像素的权重是相同的,即滤波器是线性的。而高斯滤波器中像素的权重与其距中心像素的距离成比例。
除此之外,还有一种去噪方法为中值滤波器。(主要用来处理图像中的椒盐现象)
椒盐现象(图像中的黑白噪声)图:
函数返回处理结果,第一个参数是待处理图像,第二个参数是孔径的尺寸,一个大于1的奇数。比如这里是5,中值滤波器就会使用5×5的范围来计算。即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。
如果在某个像素周围有白色或黑色的像素,这些白色或黑色的像素不会选择作为中值(最大或最小值不用),而是被替换为邻域值。
result = cv2.medianBlur(image,5)
通过降噪以后进行二值化得出处理后的结果图
除去了不必要的细节保留了绝大部分主特征。