赞
踩
网上说的那些,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)
通过降噪以后进行二值化得出处理后的结果图
除去了不必要的细节保留了绝大部分主特征。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。