cv2.imread()函数读取图像的通道顺序为BGR,主流的图像通道顺序为RGB。
2.1 图像运算
图像对应像素进行加减乘除运算。
cv2.add(img1, img2)
cv2.subtract(img1, img2)
cv2.multiply(img1, img2)
cv2.dicide(img1, img2)
与、或、非、异或运算。
cv2.bitwise_and(img1, img2)
cv2.bitwise_or(img1, img2)
cv2.bitwise_not(img1)
cv2.bitwise_xor(img1, img2)
2.2 色彩空间转换
使用 cvtColor(src, dst, type, channels)
函数。常用的颜色空间有BRG、RGB、GRAY、HSV、HLS。
2.3 图像几何变换
平移、缩放、旋转等操作。
rows, cols, _ = img.shape
m = 100; n = 50
M = np.float32([[1, 0, m], [0, 1, n]])
translation = cv2.warpAffine(img, M, (cols, rows))
resize = cv2.resize(img, None, fx=2, fy=1.5)
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0, 90, 1)
rotation = cv2.warpAffine(img, M, (cols, rows))
对于透射变换,需要创建一个3×3的变换矩阵。要找到此变换矩阵,需要输入图像上的四个点的坐标,以及这四个点在输出图像上对应的坐标。在这四个点中,其中三个不应该共线。
可通过cv2.getPerspectiveTransform()找到变换矩阵,再使用cv2.warpPerspective()应用此3×3变换矩阵。
pts1 =
pts2 =
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (width, heigh))
2.4 图像平滑
定义:取周围像素点的均值作为该点新的像素值。
blur = cv2.blur(img, ksize=(5, 5))
定义:与均值平滑的不同之处在于,不同位置的像素被赋予了不同的权重,权重呈现高斯分布。
GaussianBlur = cv2.GaussianBlur(img, ksize=(25, 25), sigmaX = 9)
定义:取中位数作为该点新的像素值。
medianblur = cv2.medianBlur(img, ksize = 11)
高斯滤波是以距离为权重,只考虑了像素间的空间上的关系,因此滤波的结果会丢失边缘的信息。
定义:在此基础上,双边滤波考虑了像素值大小的关系,来确定权重值,可保留边缘。
- 空间距离
- 灰度距离
bilateralFilter = cv2.bilateralFilter(img, d=9, sigmaColor=100, sigmaSpace=100)
2.5 形态学处理
形态学是图像处理中应用最为广泛的技术之一,只要用于从图像中提取有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。
取区域中像素值的最大值,代替中心点位置的像素值。
当二值化图像与卷积核做卷积,只要有一个点的像素值为1,则中心点像素值变为1;如果所有像素值都为0,则保留原来的像素值。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,5))
dilate = cv2.dilate(img, kernel, iterations=1)
当二值化图像与卷积核做卷积,只要有一个点的像素值为0,则中心点像素值变为0;如果所有像素值都为1,则保留原来的像素值。
可去除灰度值较大的噪点。
kernel = np.ones((3,3), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
先腐蚀后膨胀。
作用:
- 去除噪声
- 在纤细点处分离物体
- 平滑较大物体的边界,同时并不明显改变其面积
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,10))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
先膨胀后腐蚀。
作用:
- 关闭前景物体内部的小孔
- 平滑对象的轮廓
- 将狭窄的缺口连接成细长的弯口
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,10))
opening = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
2.6 边缘检测
目的:标识数字图像中亮度变化明显的点。
Canny边缘检测的主要步骤:
- 去除噪声,通常使用高斯平滑
- 计算图像的梯度
- 过滤非边缘像素:使用非极大值抑制技术,将模糊的边界变得清晰
- 双阈值筛选:设置高低阈值,区分强弱边缘
gaussianblur = cv2.GaussianBlur(img, (3,3),0)
canny = cv2.Canny(gaussianblur, 50, 150)
2.7 直方图处理
灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。其横坐标是灰度级;纵坐标是出现的个数(概率)。
在使用轮廓线确定物体边界时,可通过直方图更好地选择边界阈值,进行阈值化处理;对物体与背景有较强对比的景物的分割有帮助。
plt.hist(img,ravel(), 256, [0,256])
plt.show()
把原图像变换为在整个灰度范围内均匀分布的形式,用于提高图像的质量
步骤:
- 统计图像中每个灰度级出现的次数,计算图像中每个灰度级出现的概率
- 根据变换公式得到直方图均衡化的变换函数(严格的单调递增函数)
- 根据变换函数映射到每个像素点
- 输出映射后的图像
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:, :, 0] = cv2.equalizeHist(img_yuv[:, :, 0])
img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2RGB)
plt.imshow(img_output)
plt.show()
Original: https://blog.csdn.net/Bruce_lj/article/details/123467493
Author: Bruce_lj
Title: cookdata计算机视觉笔记整理
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644646/
转载文章受原作者版权保护。转载请注明原作者出处!