python下openCV学习笔记(二)图像灰度转化,模糊化,边缘检测,膨胀与腐蚀
一、图像的灰度化
很多时候我们在进行图像处理的时候,需要使用灰度图像,为什么使用灰度图像?从目前已知的知识来看,灰度图像相较于彩色图像处理起来更快,灰度化之后矩阵维数下降,运算速度大幅度提高,并且梯度信息仍然保留。但是若使用关于颜色的算法就当然的不能对 图像进行灰度化
import cv2
img = cv2.imread("img/bingbing_is_mine.jpg")
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #对图像进行灰度化,两个参数,第一个指图像数据,
#第二个参数指灰度
cv2.imshow("imgGray",imgGray)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用cvtColor()方法对图像进行颜色空间转换(HSV,HSI等颜色空间转换),也可以向灰度转换。在openCV中,使用BGR来指代RGB颜色,所以COLOR_BGR2GRAY表示转换为灰度(RGB to Gray?)
二、图像的模糊化
import cv2
img = cv2.imread("img/bingbing_is_mine.jpg")
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),0) #使用高斯滤波对图像进行模糊化处理
cv2.imshow("imgBefore",imgGray)
cv2.imshow("imgAfter",imgBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用GaussianBlur()方法对图像进行平滑(模糊)处理,上面代码展示是对灰度图像的模糊化处理。
什么是高斯滤波?形象点说就是用一个模板(高斯核)对图像从左到右,从上到下遍历过去。类似于CNN神经网络。
常用的参数是 cv2.GaussianBlur(src, (blur1, blur2), 0):
第一个参数指的是原图像,
第二个参数高斯核大小,一般是奇数,其中越大则模糊程度越大,(1,1)则表示不处理,两个数可以不同。
第三个参数指的是标准差,一般取0。
三、图像的边缘检测
import cv2
img = cv2.imread("img/bingbing_is_mine.jpg")
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(5,5),0)
imgCanny1 = cv2.Canny(imgBlur,100,150) #边缘检测代码
imgCanny2 = cv2.Canny(imgBlur,50,100)
cv2.imshow("imgBefore",imgCanny1)
cv2.imshow("imgAfter",imgCanny2)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用Canny()函数对图像进行边缘检测。在使用高斯滤波去除图像噪点消除影响后,可以对图像进行边缘检测。常用参数cv2.Canny(src, thresh1, thresh2) :
第一个参数:src表示输入的图片,
第二个参数:thresh1表示最小阈值,
第三个参数:thresh2表示最大阈值,双阈值用于删选边缘信息。
下图是不同阈值之间的比较,可以看出在最大阈值和最小阈值都偏小的情况下,我们可以看出右边的冰冰比左边的冰冰拥有更多的轮廓信息,但也容易存在非边缘点的信息。
四、图像的膨胀与腐蚀
import cv2
import numpy as np
img = cv2.imread("img/bingbing_is_mine.jpg")
kernel = np.ones((5,5),np.uint8)
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(5,5),0)
imgCanny = cv2.Canny(imgBlur,50,100)
imgDialation = cv2.dilate(imgCanny,kernel,iterations=1) #膨胀
imgEroded = cv2.erode(imgDialation,kernel,iterations=1) #腐蚀
cv2.imshow("imgBefore",imgCanny)
cv2.imshow("imgAfter1",imgDialation)
cv2.imshow("imgAfter2",imgEroded)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.dilate()与cv2.erode()分别是图像的膨胀与腐蚀,这里一般有三个参数:
第一个参数是原图像,第二个参数是核的大小,第三个参数是迭代次数。
这里我仅运行过一次代码并未深入学习。
下图中第一张图为边缘检测图,第二张图为膨胀图像,第三章为膨胀图像的腐蚀图像。