当前位置:   article > 正文

Opencv图像处理总结(持续更新)_opencv图像实时处理csdn

opencv图像实时处理csdn

这几天在进行印章提取、识别的代码开发,其中用到了几个opencv库的几个函数,脑袋中想到了要用到什么处理,但是却忘记了各个函数库比如二值化、膨胀/腐蚀等函数的参数,因此每个函数都查找了好久才想起来每个函数参数中的意思,因此在这篇blog中想总结一下opencv用过的函数,方便我自己以后查找、使用。

目录

1、读取图像

2、图像形状

3、图像缩放

4、图像保存

5、图像格式转换

6、图像二值化

7、图像形态学操作

8、图像边缘检测

9、图像融合

10、图像通道分割及合并

11、图像轮廓检测及绘制

12、图像滤波

13、几何图像绘制


1、读取图像

image = cv2.imread(filename,   flags)

filename:   需要读取图像的绝对路径。

flags(一般省略,需要时填上):   需要的格式

(1)cv2.IMREAD_UNCHANGED :原图

(2)cv2.IMREAD_COLOR :彩色图像

(3)cv2.IMREAD_GRAYSCALE :灰度图像

示例:

  1. import cv2
  2. image_path = "C:/Users/Roger/Desktop/lena.jpg"
  3. image = cv2.imread(image_path)
  4. cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
  5. cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
  6. cv2.destroyAllWindows() # 关闭所有窗口

2、图像形状

  1. import cv2
  2. image_path = "C:/Users/Roger/Desktop/lena.jpg"
  3. image = cv2.imread(image_path)
  4. height, width, channel = image.shape # 高、宽、通道数
  5. print(height, width, channel)
  6. cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
  7. cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
  8. cv2.destroyAllWindows() # 关闭所有窗口

3、图像缩放

image_resize = cv2.resize(image, (h, w), method)

image:输入图像

(h,w):缩放之后的图像大小

method:使用怎么样的方法缩放,一般是线性插值(cv2.INTER_LINEAR)和最近邻插值 (cv2.INTER_NEAREST)

  1. import cv2
  2. image_path = "C:/Users/Roger/Desktop/0.jpg"
  3. image = cv2.imread(image_path)
  4. image = cv2.resize(image, (256, 256), cv2.INTER_LINEAR)
  5. print(image.shape)
  6. cv2.imshow("image", image)
  7. cv2.waitKey(0)
  8. cv2.destroyAllWindows() # 关闭所有窗口

4、图像保存

cv2.imwrite(filename, image)

filename:保存图像的绝对路径

image:要保存的图像

示例:

  1. import cv2
  2. image_path = "C:/Users/Roger/Desktop/lena.jpg"
  3. image = cv2.imread(image_path)
  4. cv2.imwrite("C:/Users/Roger/Desktop/lena_imwrite.jpg", image)
  5. cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
  6. cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
  7. cv2.destroyAllWindows() # 关闭所有窗口

5、图像格式转换

image_cvt = cv2.cvtColor(image, flags)

image:要转换的图像

flags:需要转换成的格式

(1)cv2.COLOR_BGR2RGB:BGR 格式转 RGB 格式

(2)cv2.COLOR_BGR2GRAY:BGR 格式转 灰度图 格式

(3)cv2.COLOR_BGR2HSV:BGR 格式转 HSV 颜色空间格式

(4)cv2.COLOR_BGR2HLS:BGR 格式转 HLS 颜色模式格式

由于 opencv 读取上来的格式为 BGR 格式,因此只介绍 BGR 转其他格式图像,RGB转其他图像也是类似,如 RGB 格式转 BGR 格式:cv2.COLOR_RGB2BGR。

示例:

  1. import cv2
  2. image_path = "C:/Users/Roger/Desktop/lena.jpg"
  3. image = cv2.imread(image_path)
  4. image_cvt = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  5. cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
  6. cv2.imshow("image_cvt", image_cvt) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
  7. cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
  8. cv2.destroyAllWindows() # 关闭所有窗口

6、图像二值化

retVal, dst= cv2.threshold(src, thresh, maxval, method)

参数:

src:灰度图像

thresh:起始阈值

maxval:最大阈值

method:方法参数

(1)cv2.THRESH_BINARY:当前像素的值大于最小阈值 thresh 时,则该像素值变为 maxval ,其他情况下像素值为 0。

(2)cv2.THRESH_BINARY_INV:当前像素的值大于最小阈值 thresh 时,则该像素值变为 0,其他情况下像素值为 maxval。

(3)cv2.THRESH_TRUNC:当前像素值大于最小阈值 thresh 时,则该像素值变为 thresh,其他情况下像素值不变。

(4)cv2.THRESH_TOZERO:当前像素值大于最小阈值 thresh 时,则该像素值不变,其他情况下像素值变为 0。

(5)cv2.THRESH_TOZERO_INV:当前像素值大于最小阈值 thresh 时,则该像素变成 0,其他情况下像素值不变。

以下是比较特殊的 3 种方法,可与以上 5 种方法配合使用:

(1)cv2.THRESH_OTSU:使用最小二乘法处理像素点。

(2)cv2.THRESH_TRIANGLE:使用三角算法处理像素点。

(3)cv2.THRESH_MASK:掩膜操作。

配合使用示例:

retVal, dst= cv2.threshold(src, thresh, maxval, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

函数返回值:

retVal:分割的阈值。

dst:分割的图像。

函数使用示例:

  1. import cv2
  2. image_path = "C:/Users/Roger/Desktop/0.jpg"
  3. image = cv2.imread(image_path)
  4. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  5. retVal, dst = cv2.threshold(image_gray, 200, 255, cv2.THRESH_BINARY)
  6. cv2.imshow("image", image)
  7. cv2.imshow("dst", dst)
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows() # 关闭所有窗口

7、图像形态学操作

(1)图像膨胀

image_dilate = cv2.dilate(image, kernel, iterations)

 image:要进行膨胀操作的图像

kernel:卷积核

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/thresh.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_dilate = cv2.dilate(image_gray, kernel, iterations=1)
  8. cv2.imshow("image", image)
  9. cv2.imshow("image_dilate", image_dilate)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

作用:填充图像中的小孔洞、连接图像中的断开的区域。

(2)图像腐蚀

image_erode = cv2.erode(image, kernel, iterations)

image:要进行腐蚀操作的图像

kernel:卷积核

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/thresh.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_erode = cv2.erode(image_gray, kernel, iterations=1)
  8. cv2.imshow("image", image)
  9. cv2.imshow("image_erode", image_erode)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

作用:去除比较小的噪声、分离紧密连接的区域、 去除边界。

(3)开运算(先腐蚀后膨胀)

image_open = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, iterations)

image:要进行开运算操作的图像

cv2.MORPH_OPEN:开运算方法

kernel:卷积核大小

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/thresh.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_open = cv2.morphologyEx(image_gray, cv2.MORPH_OPEN, kernel, iterations=1)
  8. cv2.imshow("image_open", image_open)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows() # 关闭所有窗口

作用:去掉孤立的小点,去除噪声,断开比较细小连接的点

(4)闭运算(先膨胀再腐蚀)

image_close = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel, iterations)

image:要进行闭运算操作的图像

cv2.MORPH_CLOSE:闭运算方法

kernel:卷积核

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/thresh.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_close = cv2.morphologyEx(image_gray, cv2.MORPH_CLOSE, kernel, iterations=1)
  8. cv2.imshow("image_close", image_close)
  9. cv2.imshow("image", image)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

 作用:填充区域间的空洞、弥合小缝隙。

(5)梯度运算(膨胀图像 - 腐蚀图像)

image_gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel, iterations)

image:要进行梯度运算的图像

cv2.MORPH_GRADIENT:梯度运算方法

kernel:卷积核

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/0.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_gradient = cv2.morphologyEx(image_gray, cv2.MORPH_GRADIENT, kernel, iterations=1)
  8. cv2.imshow("image_gradient", image_gradient)
  9. cv2.imshow("image", image)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

 作用:凸显出图像的边缘,保留图像边缘的轮廓,用于边缘检测。

(6)礼帽 / 顶帽(开运算图像 - 原图)

image_tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel, iterations)

image:要进行礼帽运算的图像

cv2.MORPH_TOPHAT:礼帽运算方法

kernel:卷积核

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/0.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_tophat = cv2.morphologyEx(image_gray, cv2.MORPH_TOPHAT, kernel, iterations=1)
  8. cv2.imshow("image_tophat", image_tophat)
  9. cv2.imshow("image", image)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

作用:往往用来提取图像中比临近点亮度高的一些斑块,用于突出亮度变化。 

(7)黑帽(闭运算图像 - 原图)

image_blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel, iterations)

image:要进行黑帽运算的图像

cv2.MORPH_BLACKHAT:黑帽运算方法

kernel:卷积核

iterations:迭代次数

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/0.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. kernel = np.ones((3,3), np.uint8)
  7. image_blackhat = cv2.morphologyEx(image_gray, cv2.MORPH_BLACKHAT, kernel, iterations=1)
  8. cv2.imshow("image_blackhat", image_blackhat)
  9. cv2.imshow("image", image)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

 作用:往往用来提取比其他邻近区域亮度低一些的区域,用于突出暗度变化。

8、图像边缘检测

(1)Canny算子

image_canny = cv2.Canny(image, threshold1, threshold2)

image:输入图像

threshold1:像素阈值1

threshold2:像素阈值2

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/thresh.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. image_canny = cv2.Canny(image_gray, 0, 255)
  7. cv2.imshow("image", image)
  8. cv2.imshow("image_canny", image_canny)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows() # 关闭所有窗口

(2)Sobel算子

sobel_x_ / sobel_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)

src:输入图像

ddepth:图像深度,如cv2.CV_16S

dx / dy:x / y 方向上的求导的阶数,0 表示这个方向上没有求导,一般填0、1、2

ksize:Sobel算子卷积核大小,一般为奇数1、3、5、7

scale:缩放系数,一般默认即可

absX / absY = cv2.convertScaleAbs(sobel_x / sobel_y)

sobel_x / sobel_y:在 x / y 方向上的导数边缘

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/thresh.jpg"
  4. image = cv2.imread(image_path)
  5. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6. x = cv2.Sobel(image_gray, cv2.CV_16S, 0, 1)
  7. y = cv2.Sobel(image_gray, cv2.CV_16S, 1, 0)
  8. abs_x = cv2.convertScaleAbs(x)
  9. abs_y = cv2.convertScaleAbs(y)
  10. image_sobel = cv2.addWeighted(abs_x, 0.5, abs_y, 0.5, 0) # 图像融合
  11. cv2.imshow("image", image)
  12. cv2.imshow("image_sobel", image_sobel)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows() # 关闭所有窗口

9、图像融合

image_add= cv2.addWeighted(image1, alpha, image2, beta, gamma)

image1:输入图像1

alpha:图像1在融合图像中的权重

image2:输入图像2

beta:图像2在融合图像中的权重

gamma:图像增益

示例:

  1. import cv2
  2. import numpy as np
  3. image_path1 = "C:/Users/Roger/Desktop/0.jpg"
  4. image_path2 = "C:/Users/Roger/Desktop/lena.jpg"
  5. image1 = cv2.imread(image_path1)
  6. image2 = cv2.imread(image_path2)
  7. image1 = cv2.resize(image1, (256, 256), cv2.INTER_LINEAR)
  8. image2 = cv2.resize(image2, (256, 256), cv2.INTER_LINEAR)
  9. image_add= cv2.addWeighted(image1, 0.5, image2, 0.5, 0)
  10. cv2.imshow("image1", image1)
  11. cv2.imshow("image2", image2)
  12. cv2.imshow("image_add", image_add)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows() # 关闭所有窗口

10、图像通道分割及合并

(1)通道分割

B, G, R = cv2.split(image)

image:输入图像

B:b 通道图像

G:g 通道图像

R:r 通道图像

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/lena.jpg"
  4. image = cv2.imread(image_path)
  5. b, g, r = cv2.split(image)
  6. cv2.imshow("image", image)
  7. cv2.imshow("r", r)
  8. cv2.imshow("g", g)
  9. cv2.imshow("b", b)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows() # 关闭所有窗口

(2)通道合并

image_merge = cv2.merge([B, G, R]) # 注意 b g r 通道的位置顺序决定合并成 BGR 格式图像还是 RGB 格式图像

B:b 通道上图像

G:g 通道上图像

R:r 通道上图像

image_merge:以 BGR 通道合并之后的 BGR 格式图像

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/lena.jpg"
  4. image = cv2.imread(image_path)
  5. b, g, r = cv2.split(image)
  6. image_merge = cv2.merge([b, g, r])
  7. cv2.imshow("image", image)
  8. cv2.imshow("r", r)
  9. cv2.imshow("g", g)
  10. cv2.imshow("b", b)
  11. cv2.imshow("image_merge", image_merge)
  12. cv2.waitKey(0)
  13. cv2.destroyAllWindows() # 关闭所有窗口

11、图像轮廓检测及绘制

11.1    图像轮廓检测

contours, hierarchy = cv2.findContours(image, mode, method)

参数: 

image:输入的二值化图像

mode:不同轮廓检索模式

(1)cv2.RETR_LIST:这是一种最简单的轮廓检索方式,它不建立轮廓间的子属关系,也就是说它的所有的轮廓属于同一层级。

(2)cv2.RETR_TREE:完整建立轮廓的层级从属关系。

(3)cv2.RETR_EXTERNAL:只寻找最高层级的轮廓

(4)cv2.RETR_CCOMP:把所有轮廓分为两个层级,不是里层就是外层。

method:轮廓的估计方法

(1)cv2.CHAIN_APPROX_NONE:存储所有边界点。

(2)cv2.CHAIN_APPROX_SIMPLE:去除所有冗余点并压缩轮廓,从而节省内存。

返回值:

contours:一个包含了图像中所有轮廓的 list 列表,其中每一个轮廓以边界点坐标 (x, y) 的形式存储在 numpy 数组中。

hierarchy:一个包含四个值的数组,为 [Next, Previous, First Children, Parent],一般不使用。

(1)Next:与当前轮廓处于同一层级的下一条轮廓。

(2)Previous:与当前轮廓处于同一层级的上一条轮廓。

(3)First Children:当前轮廓的第一条子轮廓。

(4)Parent:当前轮廓的父级轮廓。

11.2    轮廓绘制

cv2.drawContours(image, cnt, contourIdx, color, thickness)

image:需要绘制轮廓的图像

cnt:轮廓信息的数组

contourIdx:绘制哪个轮廓的索引,-1为绘制所有轮廓

color:绘制轮廓的颜色,是一个元组,如 (0, 0, 255)

thickness:绘制轮廓的线的大小

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/0.jpg"
  4. image = cv2.imread(image_path)
  5. image_copy = image.copy()
  6. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7. retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)
  8. contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
  9. # pattern
  10. for i in range(len(contours)):
  11. cv2.drawContours(image_copy, contours[i], -1, (0, 0, 255), 2)
  12. cv2.imshow("image", image)
  13. cv2.imshow("image_copy", image_copy)
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows() # 关闭所有窗口

11.3 根据阈值筛选轮廓面积

area = cv2.contoursArea(contours[i])

参数: 

contours[i]:findContours函数返回的 contours 数组中的一个轮廓

返回值:

area:循环到当前轮廓的面积

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/0.jpg"
  4. image = cv2.imread(image_path)
  5. image_copy = image.copy()
  6. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7. retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)
  8. contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
  9. # pattern
  10. for i in range(len(contours)):
  11. area = cv2.contourArea(contours[i])
  12. if area < 200:
  13. continue
  14. cv2.drawContours(image_copy, contours[i], -1, (0, 0, 255), 2)
  15. cv2.imshow("image", image)
  16. cv2.imshow("image_copy", image_copy)
  17. cv2.waitKey(0)
  18. cv2.destroyAllWindows() # 关闭所有窗口

11.4 绘制最小矩形框

rect = cv2.minAreaRect(contours[i])

参数:

contours[i]:findContours函数返回的 contours 数组中的一个轮廓

返回:

rect:返回 (center(x, y), (width, height), angle of rotation) 的 Box2D结构

  1. # Box2D 结构转换成 4 个角点
  2. points = cv2.boxPoints(rect)

参数:

rect:输入为 (center(x, y), (width, height), angle of rotation) 的 Box2D结构

返回:

points:返回的是最小矩形框的 4 个角点

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/0.jpg"
  4. image = cv2.imread(image_path)
  5. image_copy = image.copy()
  6. image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7. retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)
  8. contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
  9. # pattern
  10. for i in range(len(contours)):
  11. area = cv2.contourArea(contours[i])
  12. if area < 200:
  13. continue
  14. # 找到包含轮廓的最小矩形框,返回的是(center(x, y), (width, height), angle of rotation)的 Box2D结构
  15. rect = cv2.minAreaRect(contours[i])
  16. # Box2D 结构转换成 4 个角点
  17. points = cv2.boxPoints(rect)
  18. # 角点类型转换成整型
  19. points = np.int0(points)
  20. # 绘制矩形
  21. cv2.drawContours(image_copy, [points], -1, (0, 0, 255), 2)
  22. cv2.imshow("image", image)
  23. cv2.imshow("image_copy", image_copy)
  24. cv2.waitKey(0)
  25. cv2.destroyAllWindows() # 关闭所有窗口

12、图像滤波

(1)均值滤波

image_blur = cv2.blur(image, ksize)

image:输入图像

ksize:卷积核大小,如 (3, 3)、(5, 5)

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
  4. image = cv2.imread(image_path)
  5. image_blur = cv2.blur(image, (3, 3))
  6. cv2.imshow("image", image)
  7. cv2.imshow("image_blur", image_blur)
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows() # 关闭所有窗口

(2)中值滤波

image_median = cv2.medianBlur(image, ksize)

image:输入图像

ksize:卷积核大小,是一个整数,如 ksize 为 3,则生成 (3, 3) 大小的卷积核

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
  4. image = cv2.imread(image_path)
  5. image_median = cv2.medianBlur(image, 3)
  6. cv2.imshow("image", image)
  7. cv2.imshow("image_median", image_median)
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows() # 关闭所有窗口

(3)双边滤波

image_bilateral = cv2.bilateralFilter(image, d, sigmaColor, sigmaSpace, borderType)

image:输入图像

d:d是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。

sigmaColor:sigmaColor是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。

sigmaSpace:sigmaSpace是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与 sigmaSpace的值成比例。

borderType:borderType是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
  4. image = cv2.imread(image_path)
  5. image_bilateral = cv2.bilateralFilter(image, 9, 150, 150)
  6. cv2.imshow("image", image)
  7. cv2.imshow("image_bilateral", image_bilateral)
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows() # 关闭所有窗口

(4)高斯滤波

image_gaussian = cv2.GaussianBlur(image, ksize, sigmaX, sigmaY, borderType)

 image:输入图像

ksize:卷积核大小,如(3,3)、(5,5)

sigmaX:X 方向上的标准偏差

sigmaY:Y 方向上的标准偏差

borderType:边界样式,一般不用管,默认即可

示例:

  1. import cv2
  2. import numpy as np
  3. image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
  4. image = cv2.imread(image_path)
  5. image_gaussian = cv2.GaussianBlur(image, (5, 5), 0, 0)
  6. cv2.imshow("image", image)
  7. cv2.imshow("image_gaussian", image_gaussian)
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows() # 关闭所有窗口

13、几何图像绘制

(1)直线

cv2.line(image, p1, p2, color, thickness, lineType, shift)

image:要绘制的输入图像

p1:直线坐标1,如 (100, 100)

p2:直线坐标2,如 (400, 100)

color:直线颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色

thickness:直线宽度

lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA

shift:坐标小数点位数,一般默认

示例:

  1. import cv2
  2. import numpy as np
  3. image = np.zeros((500, 500, 3), dtype=np.uint8)
  4. cv2.line(image, (100, 100), (400, 100), (255, 0, 0), 2, cv2.LINE_4)
  5. cv2.line(image, (100, 200), (400, 200), (0, 255, 0), 2, cv2.LINE_8)
  6. cv2.line(image, (100, 300), (400, 300), (0, 0, 255), 2, cv2.LINE_AA)
  7. cv2.imshow("image", image)
  8. cv2.waitKey(0)

(2)圆形

cv2.circle(image, center, radius, color, thickness, lineType, shift)

image:要绘制的输入图像

center:圆心坐标,如 (100, 100)

radius:半径大小, 如 50

color:直线颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色

thickness:直线宽度,-1 表示内部填充

lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA

shift:坐标小数点位数,一般为默认

示例:

  1. import cv2
  2. import numpy as np
  3. image = np.zeros((400, 500, 3), dtype=np.uint8)
  4. cv2.circle(image, (100, 100), 70, (255, 0, 0), 2, cv2.LINE_4)
  5. cv2.circle(image, (250, 200), 70, (0, 255, 0), 2, cv2.LINE_8)
  6. cv2.circle(image, (400, 300), 70, (0, 0, 255), -1, cv2.LINE_AA)
  7. cv2.imshow("image", image)
  8. cv2.waitKey(0)

(3)矩形框

cv2.rectangle(image, pt1, pt2, color, thickness, lineType)

image:要绘制的输入图像

pt1:要绘制矩形的左上角坐标,如 (100, 100)

pt2:要绘制矩形的左上角坐标,如 (200, 200)

color:直线颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色

thickness:直线宽度,-1 表示内部填充

lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA

示例:

  1. import cv2
  2. import numpy as np
  3. image = np.zeros((400, 500, 3), dtype=np.uint8)
  4. cv2.rectangle(image, (50, 150), (150, 250), (255, 0, 0), 2, cv2.LINE_4)
  5. cv2.rectangle(image, (200, 150), (300, 250), (0, 255, 0), 2, cv2.LINE_8)
  6. cv2.rectangle(image, (350, 150), (450, 250), (0, 0, 255), -1, cv2.LINE_AA)
  7. cv2.imshow("image", image)
  8. cv2.waitKey(0)

 

(4)多边形

cv2.polylines(image, pts, isClosed, color, thickness, lineType, shift)

image:要绘制的输入图像

pts:int32类型的坐标数组

color:多边形颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色

thickness:直线宽度,不能直接内部填充

lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA

shift:坐标小数点位数,一般为默认

示例:

  1. import cv2
  2. import numpy as np
  3. import random
  4. image = np.zeros((400, 500, 3), dtype=np.uint8)
  5. points = []
  6. for i in range(10):
  7. pt1 = random.randint(50, 400)
  8. pt2 = random.randint(50, 400)
  9. points.append([pt1, pt2])
  10. points = [np.array(points, dtype=np.int32)]
  11. print(points)
  12. cv2.polylines(image, points, isClosed=True, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_4, shift=None)
  13. cv2.imshow("image", image)
  14. cv2.waitKey(0)

 

 (5)填充多边形(fillConvexPoly)

cv2.fillConvexPoly(image, points, color, lineType, shift)

image:要绘制的输入图像

pts:int32类型的多边形顶点坐标

color:多边形颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色

lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA

shift:坐标小数点位数,一般为默认

示例:

  1. import cv2
  2. import numpy as np
  3. import random
  4. image = np.zeros((400, 500, 3), dtype=np.uint8)
  5. points = []
  6. for i in range(10):
  7. pt1 = random.randint(50, 400)
  8. pt2 = random.randint(50, 400)
  9. points.append([pt1, pt2])
  10. points = np.array(points, dtype=np.int32)
  11. print(points)
  12. cv2.fillConvexPoly(image, points, color=(0, 255, 0), lineType=cv2.LINE_4, shift=None)
  13. cv2.imshow("image", image)
  14. cv2.waitKey(0)

 

 (5)填充多边形(fillPoly)

cv2.fillConvexPoly(image, points, color, lineType, shift)

image:要绘制的输入图像

pts:int32类型的多边形顶点坐标,且可以是多个多边形图像顶点坐标

color:多边形颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色

lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA

shift:坐标小数点位数,一般为默认

示例:

  1. import cv2
  2. import numpy as np
  3. import random
  4. image = np.zeros((400, 500, 3), dtype=np.uint8)
  5. points = []
  6. for i in range(10):
  7. pt1 = random.randint(150, 200)
  8. pt2 = random.randint(150, 200)
  9. points.append([pt1, pt2])
  10. points2 = []
  11. for i in range(10):
  12. pt1 = random.randint(200, 300)
  13. pt2 = random.randint(200, 300)
  14. points2.append([pt1, pt2])
  15. points = [np.array(points, dtype=np.int32), np.array(points2, dtype=np.int32)]
  16. points2 = []
  17. print(points)
  18. cv2.fillPoly(image, points, color=(0, 255, 0), lineType=cv2.LINE_4, shift=None)
  19. cv2.imshow("image", image)
  20. cv2.waitKey(0)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/86695
推荐阅读
相关标签
  

闽ICP备14008679号