图像读取与查看
- 读取图像:
img=cv2.imread(ori)
- 查看图像:
cv2.imshow("img",img)
cv2.waitKey(0)
#操作后关闭图像
图像预处理
- 图像灰度化:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- 滤波(去除椒盐噪音):
- 高斯滤波:
blur=cv2.GaussianBlur(gray,(5,5),0)
- 中值滤波:
blur=cv2.medianBlur(gray,5)
- 高斯滤波:
- 图像二值化(将图像转化为黑白两种颜色方便图像处理):
binary=cv2.adaptiveThreshold(~blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,35,-5)
(自适应阈值二值化,~取反变为黑底白字的图像)
提取图像的特定颜色
- BGR转为HSV(H色调,S饱和度,V亮度):
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
- 设定待提取颜色的HSV范围:
redLower=np.array([156, 43, 46])
redUpper=np.array([179, 255, 255])
- 提取颜色(待提取颜色设为白色,其余颜色设为黑色):
mask=cv2.inRange(hsv,redLower,redUpper)
形态学操作
- 形态学操作的核:
kernel=np.ones((1,18))
(保留横向的内容且少);kernel=np.ones((9,1))
(保留纵向的内容且多) - 腐蚀(黑色侵蚀):
img_erosion=cv2.erode(binary,kernel,iterations=1)
- 膨胀(白色膨胀):
img_dilation=cv2.dilate(binary,kernel,iterations=1)
- 开运算(先腐蚀后膨胀):
img_open=cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel)
- 闭运算(先膨胀后腐蚀):
img_close=cv2.morphologyEx(binary,cv2.MORPH_CLOSE,kernel)
边缘检测
- Canny算子:
edge=cv2.Canny(binary,75,200)
轮廓检测
- 轮廓检测:
contours,hierachy=cv2.findContours(edge,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
- 轮廓外接矩形:
x,y,w,h=cv2.boundingRect(c)
- 轮廓最小外接矩形:
1
2
3rect=cv2.minAreaRect(c)
box=cv2.boxPoints(rect)
box=np.int0(box) - 轮廓多边形近似:
1
2
3area=cv2.contourArea(c) #轮廓面积
peri=cv2.arcLength(c,True) #轮廓周长
approx=cv2.approxPolyDP(c,0.015*peri,True) - 轮廓绘制:
cv2.drawContours(img,[box],0,(0,0,255),1)
(参数:图像,轮廓,轮廓索引,颜色,线宽)
霍夫直线检测
1 | lines=cv2.HoughLinesP(edge,1,np.pi/180,100,minLineLength=100,maxLineGap=10) |
图像变换
透视变换(将图像投射到一个新的视平面):
- 计算透视变换矩阵:
1
2
3dst1=np.float32([[0,0],[maxWidth,0],[maxWidth,maxHeight],[0,maxHeight]])
dst2=np.float32([[0,0],[maxWidth,0],[maxWidth,maxHeight],[0,maxHeight]])
M=cv2.getPerspectiveTransform(dst1,dst2) - 进行透视变换:
warped=cv2.warpPerspective(img,M,(maxWidth,maxHeight))
(参数:图像,透视变换矩阵,输出图像尺寸)
- 计算透视变换矩阵:
图像缩放:
1
2
3height,width=img.shape #获取图像的高和宽
res=cv2.resize(img,(int(0.8*width),int(0.8*height)),interpolation=cv2.INTER_LANCZOS4) #参数:图像,输出图像尺寸,插值方法
res=cv2.resize(img,none,fx=2,fy=2,interpolation=cv2.INTER_LANCZOS4) #参数:图像,x轴比例因子,y轴比例因子,插值方法
图像裁剪
crop=img[y:y+h,x:x+w]
图像运算
- 加法:
added=cv2.add(img1,img2)
added=img1+img2
- 减法:
subtracted=cv2.subtract(img1,img2)
subtracted=img1-img2
- 交集:
bitwiseAnd=cv2.bitwise_and(img1,img2)
- 并集:
bitwiseOr=cv2.bitwise_or(img1,img2)
- 取不重叠区域:
bitwiseXor=cv2.bitwise_xor(img1,img2)
- 取反:
bitwiseNot=cv2.bitwise_not(img1,img2)
图像上绘制图形
- 直线:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)
- 矩形:
cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),cv2.FILLED)
(cv2.FILLED为填充而非边框)