OpenCV 笔记

读入图片

src_1 = cv2.imread(r"../3.jpg", 0)  # 正确读入单通道的方式
src_3 = cv2.imread(r"../3.jpg") # 以三通道的方式读入

转换图片

gray = cv2.cvtColor(src_3, cv2.COLOR_BGR2GRAY) # 三通道转换为单通道

图像里增添内容

写字

> def putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None):
>
  • img:图片
  • text:文字内容
  • org:坐标
  • fontFace:字体类型
  • fontScale:字体大小
  • color:颜色
  • thickness:字体粗细
cv2.putText(img, '文字内容', (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

画直线

画矩形

TODO

画圆圈

> def circle(img, center, radius, color, thickness=None, lineType=None, shift=None): 
>
  • img:图片
  • center:圆形的中心坐标
  • radius:半径
  • color:颜色
  • thickness:粗细
cv2.circle(img, (100, 100), 100, color, 2)  # 画圆
cv2.circle(img, (100, 100), 2, color, 1) # 画圆心

画轮廓

图像、轮廓列表、要画的轮廓坐标-1所有、颜色、粗细

cv2.drawContours(bgr_img, contours, -1, (0, 0, 255), 2)

设置整张图片纯颜色

# 设置整张图为白色
circles_img[:, :, 0] = 255
circles_img[:, :, 1] = 255
circles_img[:, :, 2] = 255

复制图片

  • 不想影响原图,而要复制一个模板图片出来处理时可用的方法
src_1.copy()

腐蚀处理

erosion = cv2.erode(th1, kernel, iterations=1)  # 腐蚀处理

膨胀处理

dilation = cv2.dilate(erosion, kernel, iterations=1)  # 膨胀处理

开运算/闭运算

  • 开运算就是先腐蚀再膨胀
  • 闭运算就是先膨胀再腐蚀
# 开
res = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel, iterations=1)
# 闭
res = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel, iterations=1)

阈值处理

处理单通道图片,颜色大于140的设置为255

ret, th1  = cv2.threshold(temp_img, 140, 255, cv2.THRESH_BINARY)  # 阈值处理

查找轮廓

contours, hierarchy = cv2.findContours(dilate, cv2.CONTOURS_MATCH_I1, 2)

inRange()

OpenCV中的inRange()函数可实现二值化功能(这点类似threshold()函数),更关键的是可以同时针对多通道进行操作,使用起来非常方便!主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。

bitwise_not()

是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1

addWeighted()

图像融合,可以给两个图片各自的比重

dst=cv2.addWeighted(img1,0.7,img2,0.3,0)

Canny边缘检测

img_ray = cv2.Canny(erosion, 50, 100)

Canny边缘检测

找圆

cv2中进行霍夫圆环检测的函数:

cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

参数详解:

  • image:8位,单通道图像。如果使用彩色图像,需要先转换为灰度图像

  • method:定义检测图像中圆的方法。目前唯一实现的方法是cv2.HOUGH_GRADIENT

  • dp:累加器分辨率与图像分辨率的反比。dp获取越大,累加器数组越小

  • minDist:检测到的圆的中心,(x,y)坐标之间的最小距离。如果minDist太小,则可能导致检测到多个相邻的圆。如果minDist太大,则可能导致很多圆检测不到

  • param1:用于处理边缘检测的梯度值方法

  • param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多

  • minRadius:半径的最小大小(以像素为单位)

  • maxRadius:半径的最大大小(以像素为单位)

circles = cv2.HoughCircles(imgray, cv2.HOUGH_GRADIENT, 1, 10, param1=100, param2=10, minRadius=13,
maxRadius=15) # 霍夫圆变换
for i in circles[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2) # 画圆
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3) # 画圆心

识别效果

模糊处理

高斯模糊

blur = cv.GaussianBlur(img,(5,5),0)

双边滤波

blur = cv.bilateralFilter(img,9,75,75)

图像几何运算

仿射变换(旋转矩阵)

rot_mat = cv2.getRotationMatrix2D(center, -5, 1)
cos = rot_mat[0,0] #余弦
sin = rot_mat[0,1] #正弦

仿射变换

cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))

参数说明: img表示输入的图片,rot_mat表示仿射变化矩阵,(image.shape[1], image.shape[0])表示变换后的图片大小

外接矩形

文章作者: 何同昊
文章链接: http://hetonghao.cn/2020/03/OpenCV笔记/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 何同昊 Blog
支付宝超级火箭🚀
微信超级火箭🚀