OpenCV图像预处理常用函数及流程
1.OpenCV环境配置
在PyCharm终端中,运行如下命令
pip install opencv-python
pip install opencv-contrib-python
由于默认使用的为外网资源,下载速度和稳定性较差,具体看网络状态。如下命令为使用清华镜像下载安装相应的包
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple
在终端中运行命令时,Windows10系统可能会存在如下报错:无法加载激活文件,因此在此系统上禁止运行脚本。此情况是因为windows新的权限执行策略的改变,需要在PowerShell中进行权限的更改。可通过开始菜单栏找到Windows PowerShell。注意使用 以管理员身份运行,否则无法更改执行策略。
在PowerShell中执行如下命令:
Get-ExecutionPolicy
如果输出值为
Restricted
则表明目前系统上禁止运行没有数字签名的脚本。需要运行如下命令,将执行策略更改为remotesigned模式
Set-ExecutionPolicy Bypass
之后重启Pycharm,重新执行OpenCV的安装命令即可。
2.图像预处理流程及对应函数
OpenCV英文官方文档链接:OpenCV: OpenCV-Python Tutorials
OpenCV中文文档:OpenCV官方文档_w3cschool
OpenCV中文文档:OpenCV中文官方文档 (woshicver.com)
(1)图像读取与颜色空间转换
img_bgr = cv2.imread("1.jpg")
img_gray = cv2.imread("1.jpg", cv2.IMREAD_GRAYSCALE)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
img_gray1 = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
(2)图像的显示
cv2.imshow("img_bgr", img_bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)图像基本属性
img_bgr.shape
h,w = img_bgr.shape[:2]
img_b = img_bgr[:, :, 0]
img_g = img_bgr[:, :, 1:2]
img_r = img_bgr[:, :, 2:3]
img_bgr.size
img_bgr[0:100,0:500]
np.zeros((100, 200), dtype=np.uint8)
(4)图像滤波
常用滤波算法包含如下几类:均值滤波、中值滤波、高斯滤波、双边滤波等
img_median_blur = cv2.medianBlur(img_bgr, 3)
img_blur = cv2.blur(img_bgr, (3, 3))
img_gaussian = cv2.GaussianBlur(img_blur, (3, 3), sigmaX=1)
img_bilater = cv2.bilateralFilter(img, 5, 75, 75)
(5)图像二值化
_, img_threshold = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY)
(6)图像形态学处理
kernel = np.ones((3, 3))
cv2.erode(img_bgr, kernel, iterations=2)
cv2.dilate(img_bgr, kernel, iterations=2)
cv2.morphologyEx(img_bgr, cv2.MORPH_OPEN, kernel, iterations=2)
cv2.morphologyEx(img_bgr, cv2.MORPH_CLOSE, kernel, iterations=2)
(7)图像的边缘提取
canny = cv2.Canny(img_bgr, 100, 200)
(8)图像的轮廓提取
contours, _ = cv2.findContours(img_threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img_bgr, contours, -1, (255, 0, 0), 2)
(9)仿射变换
src = np.float32([[748, 120], [750, 1300], [115, 1280], [110, 121]])
dst = np.float32([[660, 0], [660, 1110], [0, 1110], [0, 0]])
M = cv2.getPerspectiveTransform(src, dst)
img_p = cv2.warpPerspective(img_bgr, M, (660, 1110))
(10)霍夫圆变换
HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None):
image:要检测的圆的图像,minDist:检测到的圆之间的最小中心距离,minRadius、maxRadius检测到圆的最小半径和最大半径
method:检测方法,当前有cv2.HOUGH_GRADIENT和cv2.HOUGH_GRADIENT_ALT 2种方法,后者是前者的改进方法
dp:检测圆心的累加器精度和图像精度比的倒数,比如dp=1时累加器和输入图像有相同的分辨率,dp=2时累加器是输入图像一半大的宽高;method=cv2.HOUGH_GRADIENT_ALT时推荐设置dp=1.5
param1:特定方法参数,和method配合;当method=cv2.HOUGH_GRADIENT或method=cv2.HOUGH_GRADIENT_ALT时,该参数是canny检测的高阈值,低阈值是该参数的一半;method=cv2.HOUGH_GRADIENT_ALT时,内部使用Scharr计算图像梯度,这个值通常要设置得更大。
param2:特定方法参数,和method配合;当method=cv2.OUGH_GRADIENT,它表示检测阶段圆心的累加器阈值,越小就会检测到更多的圆,越大能通过检测的圆就更加精确。当method=cv2.HOUGH_GRADIENT_ALT时,该参数可以看做是圆的"完美性"度量,它越接近1算法选择的圆形形状越好,一般可以设置在0.9。如果想要更好地检测小圆,可以设置在0.85、0.8甚至更小,通过限制搜索范围[minRadius,maxRadius]可以避免出现许多假圆。
具体可参考官方文档,及如下博文:https://blog.csdn.net/juzicode00/article/details/122263456
cv2.HoughCircles(img_bgr, cv2.HOUGH_GRADIENT, 1, 100, param1=150, param2=200, minRadius=50, maxRadius=80) # 检测圆的最大半径80,最小半径50,检测到的两个圆之间的距离最小为100,内置canny算法的高阈值为150,低阈值为75
(11)霍夫直线检测
HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None):
image:要检测直线的图像,rho累加器的距离分辨率,以像素为单位,theta:以弧度表示的参数的分辨率,threshold:阈值,被认为是一条直线的最低投票数
cv2.HoughLines(img_bgr, 1, np.pi / 180, 100, min_theta=np.pi / 6, max_theta=np.pi / 3) # 检测角度在30°到60°之间的直线
Original: https://blog.csdn.net/sodaANDcola/article/details/125621572
Author: 苏打水可乐
Title: OpenCV图像预处理常用函数及流程
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703701/
转载文章受原作者版权保护。转载请注明原作者出处!