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

2023-11-08

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

mage:要绘制的输入图像

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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv图像处理总结(持续更新) 的相关文章

  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • 当我将鼠标移到 Mat 关键字上时,Visual Studio 2017 冻结(OpenCv 3.4.1)

    我想在 Visual Studio 2017 中开发 openCv 项目 我下载了 opencv 预构建库并进行了必要的设置 那是 1 我添加了系统路径 build x64 vc14 bin 2 在 Visual Studio 中的项目属性
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • 二值图像中骨架上两点之间的最短路径

    我有一个二进制图像 其中包含图像的一个像素宽度骨架 您可能基本上知道 在这个二值图像中 我在骨架上有 1 在其他地方有 0 如何找到骨架上两个非零元素之间的最短距离 路径也应该在骨架本身上 我想使用 A star 算法的 C 实现 我找到了
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • 使用卡尔曼滤波器跟踪位置和速度

    我正在使用卡尔曼滤波器 恒定速度模型 来跟踪物体的位置和速度 我测量对象的 x y 并跟踪 x y vx vy 这是有效的 但是如果在传感器读数 x y vx vy 上添加 20 mm 的高斯噪声 即使该点没有移动 只是噪声也会发生波动 对
  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row

随机推荐

  • linux安装nginx+php

    在centos服务器下 mkdir docker cd docker mkdir nginx mkdir php mkdir www 2 拉取镜像 docker pull nginx docker pull php 7 4 fpm dock
  • CentOS 7 分区方案

    通常系统盘都会选择性能较好SSD 一般在500G左右 这里就以500G硬盘为例 以下为CentOS 自动分区方案 分区应该按照实际服务器用途而定 自动分区方案将 home 空间分配太多了 多数情况下并不适用 必须存在的分区 分区是必须存在的
  • 如何卸载、删除Anaconda?

    Anaconda这么好用 为啥要删呢 当然是我之前装得乱七八糟 导致现在心情不好 我要把它全部删掉 ok 开始 删除思路 首先利用anaconda clean清理包清理配置文件 然后直接用安装目录下的卸载程序卸载即可 一 anaconda
  • 算法分析基础

    问题 如何比较不同算法的性能 分析算法的运行时间 算法分析的原则 归纳基本操作 如 运算 赋值 比较 统一机器性能 假设基本操作代价均为1 统一机器性能后 算法运行时间依赖于问题输入规模与实例 相同输入规模 实例影响运行 最好情况 不常出现
  • spark 参数调优3-Shuffle Behavior

    spark参数调优系列 目录地址 https blog csdn net zyzzxycj article details 81011540 Shuffle Behavior spark reducer maxSizeInFlight 默认
  • JSP中使用element-ui

    首先需要下载element ui 可以直接在github下载即可 script 引入 这样就可以使用了 如 this message 已经上传过了 无需重复上传 注 vue里面直接使用 this即可 jsp里面想使用的可以试试了
  • 浏览器客户端生成唯一标识码

    created this getFinger methods getFinger const canvas document createElement canvas const ctx canvas getContext 2d const
  • 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一 实验目的 二 实验要求 三 实验的硬件 软件平台 四 实验原理 1 1 深度学习概述 1 2 深度学习的常见结构 1 3 卷积神经网络 CNN 卷积 池化 全连接网络 1 4 卷积神经网络的大致结构 1 5 参数学习
  • 动态规划—分割回文串-ii 解析+代码

    分割回文串 ii 题目链接 分割回文串 ii 思路 分割字符串s 使得子串都是回文串 最后获得最小分割次数 那么我们可以不断把字符串缩短 判断子串是否可以被分割成回文串 并且最小分割次数 这就是子问题分割了 所以我们可以使用动态规划 状态
  • python3 发送邮件 send mail 使用 163 smtp服务器

    监控本地网络速度 通过api 请求速度 发现速度异常 发送报警邮件 usr bin env python3 coding UTF 8 import smtplib time from email mime text import MIMET
  • 深入理解equals和==的区别

    今天在群里面看到这个问题 equals和 的区别是什么 我有点迟钝 不就是如果是String类型的话equals比较的是内容 非字符串类型则比较的是内容吗 我想里面的考点也没有多少吧 然后我就回复了一个 equals本来就是为了比较内容出现
  • c++ STL中sort函数的三种使用方法

    复习一下 STL C 中的标准模板库 使用起来方便并且效率较高 sort函数有三种用法 一 对基本类型数组从小到大排序 sort 数组名 n1 数组名 n2 将数组中下标从n1到n2的元素进行从小到大排序 不包括n2 通过n1 n2 可以对
  • 已经有dll文件,报错:“缺少XXXXX.dll 无法继续执行代码。重新安装程序可能会解决此问题”解决方案

    解决方案 尝试了博客的很多方法 都建议直接复制dll到工程目录 觉得特别繁琐 而且会导致项目文件夹很大 从这篇文章得到启发 链接 项目 gt 属性 gt 调试 gt 环境 输入path 不要空格 你存储dll的目录 注意 不要有空格 例如我
  • MES相关名词解释

    SOA Service Oriented Architecture SOA 面向服务的体系结构AMR Advanced Manufacturing Research 先进制造研究机构CIM Computer Integrated Manuf
  • 【react】react全家桶介绍

    1 react基础 2 react router 路由库 3 pubsub 消息管理的库 4 redux 集中式状态管理的库 5 ant design UI库 react是用于构建用户界面的javascript库 1 发送请求获取数据 2
  • JAVA基础知识(五)

    5 4 构造方法 构造方法的主要作用就是为类中的属性初始化 类名称 对象名称 new 类名称 从格式中发现 在最后有一个类名称 的代码 在程序中只要是一看见有 就表示调用方法 那么这个方法实际上就是要表示调用构造方法 构造方法可视为一种特殊
  • 移动端如何浏览EXCEL、word、ppt、pdf等文件在线预览?

    1 简单的前端处理方式 a href 文档地址 a 或者JS window open 文档地址 新建窗口打开链接预览 window location href 文档地址 本页面内跳转链接实现预览 这种方式在不同浏览器上表现不一样 部份手机浏
  • 对所有数据类型可通用的快速排序算法

    1 引子 快速排序算法可能是最优秀的排序算法了 此算法是1960年C A Hoare发明出来的 它被列为20世纪十大算法之一 快速排序也属于广义上的冒泡排序 这是简单冒泡排序法的优化升级 两者都是通过比较大小 交换元素来排序的 不过它增大了
  • 如何构建Python软件包并上传到Pypi

    因为最近在做Python包 所以也了解了一下这个 这里我把我自己的学习经验写出来 如果哪里写的不好也请大家提出来 本文的内容大多数都来自 Packaging Python Projects Pypi 我根据我的理解进行描述一下 演示配置 操
  • Opencv图像处理总结(持续更新)

    这几天在进行印章提取 识别的代码开发 其中用到了几个opencv库的几个函数 脑袋中想到了要用到什么处理 但是却忘记了各个函数库比如二值化 膨胀 腐蚀等函数的参数 因此每个函数都查找了好久才想起来每个函数参数中的意思 因此在这篇blog中想