Opencv图像处理总结(持续更新)

这几天在进行印章提取、识别的代码开发,其中用到了几个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 :灰度图像

示例:

import cv2

image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)

cv2.imshow("image", image)  # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口

2、图像形状

import cv2

image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)

height, width, channel = image.shape  # 高、宽、通道数
print(height, width, channel)


cv2.imshow("image", image)  # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口


3、图像缩放

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

image:输入图像

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

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

import cv2

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)

image = cv2.resize(image, (256, 256), cv2.INTER_LINEAR)
print(image.shape)

cv2.imshow("image", image)

cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


4、图像保存

cv2.imwrite(filename, image)

filename:保存图像的绝对路径

image:要保存的图像

示例:

import cv2

image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)

cv2.imwrite("C:/Users/Roger/Desktop/lena_imwrite.jpg", image)

cv2.imshow("image", image)  # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
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。

示例:

import cv2

image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)

image_cvt = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.imshow("image", image)  # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.imshow("image_cvt", image_cvt)  # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
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:分割的图像。

函数使用示例:

import cv2

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

retVal, dst = cv2.threshold(image_gray, 200, 255, cv2.THRESH_BINARY)

cv2.imshow("image", image)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


7、图像形态学操作

(1)图像膨胀

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

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

kernel:卷积核

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_dilate = cv2.dilate(image_gray, kernel, iterations=1)


cv2.imshow("image", image)
cv2.imshow("image_dilate", image_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

(2)图像腐蚀

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

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

kernel:卷积核

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_erode = cv2.erode(image_gray, kernel, iterations=1)


cv2.imshow("image", image)
cv2.imshow("image_erode", image_erode)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

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

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

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

cv2.MORPH_OPEN:开运算方法

kernel:卷积核大小

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_open = cv2.morphologyEx(image_gray, cv2.MORPH_OPEN, kernel, iterations=1)

cv2.imshow("image_open", image_open)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

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

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

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

cv2.MORPH_CLOSE:闭运算方法

kernel:卷积核

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_close = cv2.morphologyEx(image_gray, cv2.MORPH_CLOSE, kernel, iterations=1)

cv2.imshow("image_close", image_close)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

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

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

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

cv2.MORPH_GRADIENT:梯度运算方法

kernel:卷积核

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_gradient = cv2.morphologyEx(image_gray, cv2.MORPH_GRADIENT, kernel, iterations=1)

cv2.imshow("image_gradient", image_gradient)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

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

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

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

cv2.MORPH_TOPHAT:礼帽运算方法

kernel:卷积核

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_tophat = cv2.morphologyEx(image_gray, cv2.MORPH_TOPHAT, kernel, iterations=1)

cv2.imshow("image_tophat", image_tophat)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

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

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

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

cv2.MORPH_BLACKHAT:黑帽运算方法

kernel:卷积核

iterations:迭代次数

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kernel = np.ones((3,3), np.uint8)
image_blackhat = cv2.morphologyEx(image_gray, cv2.MORPH_BLACKHAT, kernel, iterations=1)

cv2.imshow("image_blackhat", image_blackhat)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


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

8、图像边缘检测

(1)Canny算子

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

image:输入图像

threshold1:像素阈值1

threshold2:像素阈值2

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

image_canny = cv2.Canny(image_gray, 0, 255)


cv2.imshow("image", image)
cv2.imshow("image_canny", image_canny)
cv2.waitKey(0)
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 方向上的导数边缘

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

x = cv2.Sobel(image_gray, cv2.CV_16S, 0, 1)
y = cv2.Sobel(image_gray, cv2.CV_16S, 1, 0)

abs_x = cv2.convertScaleAbs(x)
abs_y = cv2.convertScaleAbs(y)

image_sobel = cv2.addWeighted(abs_x, 0.5, abs_y, 0.5, 0)  # 图像融合

cv2.imshow("image", image)
cv2.imshow("image_sobel", image_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


9、图像融合

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

image1:输入图像1

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

image2:输入图像2

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

gamma:图像增益

示例:

import cv2
import numpy as np

image_path1 = "C:/Users/Roger/Desktop/0.jpg"
image_path2 = "C:/Users/Roger/Desktop/lena.jpg"
image1 = cv2.imread(image_path1)
image2 = cv2.imread(image_path2)

image1 = cv2.resize(image1, (256, 256), cv2.INTER_LINEAR)
image2 = cv2.resize(image2, (256, 256), cv2.INTER_LINEAR)


image_add= cv2.addWeighted(image1, 0.5, image2, 0.5, 0)

cv2.imshow("image1", image1)
cv2.imshow("image2", image2)
cv2.imshow("image_add", image_add)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


10、图像通道分割及合并

(1)通道分割

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

image:输入图像

B:b 通道图像

G:g 通道图像

R:r 通道图像

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)

b, g, r = cv2.split(image)


cv2.imshow("image", image)
cv2.imshow("r", r)
cv2.imshow("g", g)
cv2.imshow("b", b)

cv2.waitKey(0)
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 格式图像

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)

b, g, r = cv2.split(image)

image_merge = cv2.merge([b, g, r])


cv2.imshow("image", image)
cv2.imshow("r", r)
cv2.imshow("g", g)
cv2.imshow("b", b)
cv2.imshow("image_merge", image_merge)

cv2.waitKey(0)
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:绘制轮廓的线的大小

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_copy = image.copy()

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# pattern
for i in range(len(contours)):
    cv2.drawContours(image_copy, contours[i], -1, (0, 0, 255), 2)

cv2.imshow("image", image)
cv2.imshow("image_copy", image_copy)


cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


11.3 根据阈值筛选轮廓面积

area = cv2.contoursArea(contours[i])

参数: 

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

返回值:

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

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_copy = image.copy()

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# pattern
for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    if area < 200:
        continue
    cv2.drawContours(image_copy, contours[i], -1, (0, 0, 255), 2)

cv2.imshow("image", image)
cv2.imshow("image_copy", image_copy)


cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


11.4 绘制最小矩形框

rect = cv2.minAreaRect(contours[i])

参数:

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

返回:

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

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

参数:

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

返回:

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

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_copy = image.copy()

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# pattern
for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    if area < 200:
        continue
    # 找到包含轮廓的最小矩形框,返回的是(center(x, y), (width, height), angle of rotation)的 Box2D结构
    rect = cv2.minAreaRect(contours[i])
    # Box2D 结构转换成 4 个角点
    points = cv2.boxPoints(rect)
    # 角点类型转换成整型
    points = np.int0(points)
    # 绘制矩形
    cv2.drawContours(image_copy, [points], -1, (0, 0, 255), 2)

cv2.imshow("image", image)
cv2.imshow("image_copy", image_copy)


cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


12、图像滤波

(1)均值滤波

image_blur = cv2.blur(image, ksize)

image:输入图像

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

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)

image_blur = cv2.blur(image, (3, 3))

cv2.imshow("image", image)
cv2.imshow("image_blur", image_blur)


cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


(2)中值滤波

image_median = cv2.medianBlur(image, ksize)

image:输入图像

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

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)

image_median = cv2.medianBlur(image, 3)

cv2.imshow("image", image)
cv2.imshow("image_median", image_median)


cv2.waitKey(0)
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是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)

image_bilateral = cv2.bilateralFilter(image, 9, 150, 150)

cv2.imshow("image", image)
cv2.imshow("image_bilateral", image_bilateral)


cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口


(4)高斯滤波

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

 image:输入图像

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

sigmaX:X 方向上的标准偏差

sigmaY:Y 方向上的标准偏差

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

示例:

import cv2
import numpy as np

image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)

image_gaussian = cv2.GaussianBlur(image, (5, 5), 0, 0)

cv2.imshow("image", image)
cv2.imshow("image_gaussian", image_gaussian)


cv2.waitKey(0)
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:坐标小数点位数,一般默认

示例:

import cv2
import numpy as np


image = np.zeros((500, 500, 3), dtype=np.uint8)

cv2.line(image, (100, 100), (400, 100), (255, 0, 0), 2, cv2.LINE_4)
cv2.line(image, (100, 200), (400, 200), (0, 255, 0), 2, cv2.LINE_8)
cv2.line(image, (100, 300), (400, 300), (0, 0, 255), 2, cv2.LINE_AA)

cv2.imshow("image", image)
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:坐标小数点位数,一般为默认

示例:

import cv2
import numpy as np


image = np.zeros((400, 500, 3), dtype=np.uint8)

cv2.circle(image, (100, 100), 70, (255, 0, 0), 2, cv2.LINE_4)
cv2.circle(image, (250, 200), 70, (0, 255, 0), 2, cv2.LINE_8)
cv2.circle(image, (400, 300), 70, (0, 0, 255), -1, cv2.LINE_AA)

cv2.imshow("image", image)
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

示例:

import cv2
import numpy as np

image = np.zeros((400, 500, 3), dtype=np.uint8)

cv2.rectangle(image, (50, 150), (150, 250), (255, 0, 0), 2, cv2.LINE_4)
cv2.rectangle(image, (200, 150), (300, 250), (0, 255, 0), 2, cv2.LINE_8)
cv2.rectangle(image, (350, 150), (450, 250), (0, 0, 255), -1, cv2.LINE_AA)

cv2.imshow("image", image)
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:坐标小数点位数,一般为默认

示例:

import cv2
import numpy as np
import random

image = np.zeros((400, 500, 3), dtype=np.uint8)

points = []
for i in range(10):
    pt1 = random.randint(50, 400)
    pt2 = random.randint(50, 400)
    points.append([pt1, pt2])

points = [np.array(points, dtype=np.int32)]
print(points)
cv2.polylines(image, points, isClosed=True, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_4, shift=None)

cv2.imshow("image", image)
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:坐标小数点位数,一般为默认

示例:

import cv2
import numpy as np
import random

image = np.zeros((400, 500, 3), dtype=np.uint8)

points = []
for i in range(10):
    pt1 = random.randint(50, 400)
    pt2 = random.randint(50, 400)
    points.append([pt1, pt2])

points = np.array(points, dtype=np.int32)
print(points)

cv2.fillConvexPoly(image, points, color=(0, 255, 0), lineType=cv2.LINE_4, shift=None)

cv2.imshow("image", image)
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:坐标小数点位数,一般为默认

示例:

import cv2
import numpy as np
import random

image = np.zeros((400, 500, 3), dtype=np.uint8)

points = []
for i in range(10):
    pt1 = random.randint(150, 200)
    pt2 = random.randint(150, 200)
    points.append([pt1, pt2])

points2 = []
for i in range(10):
    pt1 = random.randint(200, 300)
    pt2 = random.randint(200, 300)
    points2.append([pt1, pt2])

points = [np.array(points, dtype=np.int32), np.array(points2, dtype=np.int32)]
points2 = []
print(points)

cv2.fillPoly(image, points, color=(0, 255, 0), lineType=cv2.LINE_4, shift=None)

cv2.imshow("image", image)
cv2.waitKey(0)

### 回答1: 如何提高 OpenCV 处理图像的速度: 1. 使用加速器:OpenCV 支持使用多种加速器,例如 CUDA 和 OpenCL。 2. 使用预先处理:在实际处理前预先处理图像,例如缩小图像大小或转换为灰度图像。 3. 优化代码:避免冗余代码,并尝试使用高效的 OpenCV 函数。 4. 并行处理:使用多核处理器或分布式系统进行并行处理。 5. 预先训练:对于机器学习模型,预先训练模型并保存模型参数,以减少每次处理图像所需的时间。 ### 回答2: 要提高OpenCV处理图像的速度,可以采取以下几种方法: 1. 使用较小的图像尺寸:如果图像的分辨率太高,可能会导致处理速度变慢。可以考虑将图像缩小到适当的尺寸,以减少计算量。 2. 使用多线程并行处理:OpenCV支持多线程处理,可以将图像分割成多个区域,分别在不同的线程中处理,以加快处理速度。 3. 使用适当的算法和函数:在进行图像处理时,选择适合的算法和函数,能够更高效地完成特定任务。了解OpenCV的函数参数和算法的特点,可以帮助我们选择合适的方法。 4. 优化代码实现:对于重复执行的代码,可以考虑进行代码优化,避免重复计算和内存操作,以提高运行效率。 5. 使用硬件加速:利用图像处理的硬件加速功能,如GPU,可以提供更高的处理速度。OpenCV也提供了与硬件加速相关的函数和算法。 6. 选择合适的数据类型:在OpenCV中,针对不同的图像类型有不同的数据类型。选择合适的数据类型,可以减少内存占用和计算量。 7. 使用OpenCV中的优化功能:OpenCV提供了一些优化的功能和库,如T-API、UMat等,可以提供更高的处理效率。 综上所述,通过调整图像尺寸、使用多线程、选择合适的算法和函数、优化代码实现、利用硬件加速、选择合适的数据类型以及使用OpenCV中的优化功能,可以有效地提高OpenCV处理图像的速度。 ### 回答3: 要提高OpenCV处理图像的速度,可以尝试以下几种方法: 1. 选择适当的图像处理算法:OpenCV提供了许多图像处理算法,每种算法都有不同的速度和效果。根据具体需求选择合适的算法,有时候简单的算法比复杂的算法更快。 2. 优化图像读取和保存速度:在读取和保存图像时,可以选择适当的图像格式(如JPEG)以减小文件大小,从而提高读取和保存的速度。 3. 并行处理:OpenCV提供了一些并行处理的函数(如并行循环),可以利用多核处理器实现并行计算,从而提高处理速度。 4. 减小图像尺寸:如果处理的图像过大,可以考虑减小图像尺寸,这样可以减少计算量,从而提高处理速度。可以使用OpenCV提供的函数来调整图像大小。 5. GPU加速:如果有GPU可用,可以使用OpenCV提供的GPU加速功能来处理图像,因为GPU在并行计算方面有很大的优势,可以显著提升处理速度。 6. 优化算法参数:某些算法拥有一些可调参数,通过调整这些参数,可以提高算法的速度和效果。 总之,要提高OpenCV处理图像的速度,需要选择适当的算法、优化图像读取和保存、并行处理、减小图像尺寸、使用GPU加速以及优化算法参数等方法来提高处理速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值