第3章 使用OpenCV 3处理图像
3.1 不同彩色空间的转换
当前计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV
灰度:去除彩色信息,变成灰阶。灰度色彩对中间处理特别有效,如人脸检测。
BGR,即蓝-绿-红色彩空间,每一个像素点用一个三元数组(B,G,R)表示。
HSV,H(Hue)是色调,S(Saturation)是饱和度,V(Value)表示黑暗的程度。
3.2 傅里叶变换
一切波形都可以由一系列正弦曲线叠加得到。
3.2.1 高通滤波器(HPF)
检测图像某个区域,根据像素和周围像素的亮度差值来提升该像素亮度的滤波器。
核(Kernel),滤波器矩阵
核是一组权重的集合,它会与应用在原图像的每一个区域,由此生成目标区域的一个像素。
在计算中央像素和周围像素的亮度差值之和后,如果亮度变化变化很大。中央像素的亮度会增加。
这在边缘检测上尤其有效,它采用一种称为高频提升滤波器的高通滤波器。
3.2.2 低通滤波器(LPF)
像素和周围像素亮度差值小于一个特定值时,平滑该像素的亮度,用于去燥和模糊化。
3.3 创建模块
为了滤波器能够重用。
创建模块filter.py
utils.py
3.4边缘检测 ~3.6 修改应用
~~
书中代码不全。
3.7 Canny边缘检测
import cv2
import numpy as np
img = cv2.imread("statue_small.jpg",0)
cv2.imwrite("canny.jpg",cv2.Canny(img,200,300))
cv2.imshow("statue_small.jpg",cv2.imread("statue_small.jpg"))cv2.imshow("canny",cv2.imread("canny.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()
3.8 轮廓检测
import cv2
import numpy as np
img = np.zeros((200,200),dtype=np.uint8)
img[50:150, 50:150] = 255
ret , thresh = cv2.threshold(img,127,255,0)
img,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
color = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
img = cv2.drawContours(color,contours,-1,(0,255,0),2)
cv2.imshow("contours",color)
cv2.waitKey()
cv2.destroyAllWindows()
3.9 边界框、最小矩形区域和最小闭圆的轮廓
import cv2
import numpy as np
img = cv2.pyrDown(cv2.imread("hammer.jpg",cv2.IMREAD_UNCHANGED))
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(),
cv2.COLOR_BGR2GRAY),127,255,cv2.THRESH_BINARY)
image,contours,hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,0,255),3)
(x,y),radius = cv2.minEnclosingCircle(c)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)
cv2.drawContours(img,contours,-1,(255,0,0),1)
cv2.imshow("contours",img)
cv2.waitKey()
cv2.destroyAllWindows()
3.10凸轮廓与Douglas-peucker算法 *并没有看懂,有种书缺页的感觉。
凸边形内部任意两点连续都在其内部。
cv2.approxPloyDP是一个OpenCV函数,它用来计算近似的多边形框。
有3个参数:
1,轮廓
2.ε
,最大差值(越小则越近似)近似多边形周长与实际周长之间的最大差值。
3.布尔标记,表示多边形是否闭合。
轮廓的周长arcLength(cnt,True)通常作为ε
的参考值。
为了计算凸形状,需要用OpenCV的cv2.convexHull函数来获取处理过的轮廓信息,
hull = cv2.convexHull(cnt)
3.11 直线和圆检测
Hough变换是直线和和形状检测背后的理论基础。
下面是OpenCV中hough变换的函数。
3.11.1 直线检测
HoughLines和HoughLinesP
区别在于第一个函数是标准Hough变换,第二个函数使用概率Hough变换(P即概率)
3.11.2 圆检测
HoughCircles函数可用来检测圆,与HoughLines类似,
3.12 检测其他形状
approxPloyDP提供多边形的近似。
结合cv2.findCoutours函数和cv2.approxDP函数就可以检测多边形。