opencv-python笔记2

opencv-python笔记2

形态学变换-高级



(3)开运算

先腐蚀再膨胀。用于去除噪声。

opening = cv.morphologyEx(noi_src, cv.MORPH_OPEN, kernel)

(4)闭运算

先膨胀再腐蚀。被用于填充前景物体中的小洞,或前景物体上的小黑点。

closing = cv.morphologyEx(noi_src, cv.MORPH_CLOSE, kernel)


(5)形态学梯度

图像膨胀与腐蚀的差别。前景物体的轮廓。

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

(6)礼帽

原始图像与进行开运算之后得到的图像的差。
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)


(7)黑帽

进行闭运算之后得到的图像与原始图像的差。
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)


图像梯度

梯度简单来说就是求导。OpenCV提供了三种不同的梯度滤波器,或者高通滤波器:sobel,scharr和laplacian。

1.sobel

//sobelx = cv2.Sobel(test1,cv2.CV_64F,0,1,ksize = 3)

test是传入的要进行处理的图像,cv2.CV_64F是一种保存数值的类型,能够保存负数,0表示先不计算水平方向的梯度,1表示计算竖直方向的梯度,当然,我们也可以将参数改为1,1以同时计算竖直方向和水平方向的梯度,但是分开计算再融合图片所得到的效果要更好一些,这里的ksize表示卷积核的范围大小。

1.
sobelx = cv2.Sobel(pie,cv2.CV_64F,1,0,ksize = 3)#只计算横轴


sobely = cv2.Sobel(pie,cv2.CV_64F,0,1,ksize = 3)#只计算竖轴


sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#融合两张图像


sobelxy = cv2.Sobel(pie,cv2.CV_64F,1,1,ksize = 3)#同时计算横轴和竖轴

2.

sobelxy = cv2.convertScaleAbs(sobelxy)#转化为绝对值

cv2_imshow("sobelxy",sobelxy)#展示图像

2.scharr算子

scharr算子sobel算子 原理相同,用法也相同,只是scharr算子对梯度更为敏感,原因是在卷积核中,它将乘数扩大到了10和3,相当于将梯度扩大了10被和3倍,这样所得到的梯度图像将会更加的细致。

opencv-python笔记2_第1张图片

import cv2
import numpy as np
import matplotlib.pyplot as plt
test1_gray = cv2.imread("test1.png",cv2.IMREAD_GRAYSCALE)#读入灰度图像
scharrx = cv2.Scharr(test1_gray,cv2.CV_64F,0,1)#scharr算子梯度处理灰度图像,只处理水平方向
scharry = cv2.Scharr(test1_gray,cv2.CV_64F,1,0)#scharr算子梯度处理灰度图像,只处理竖直方向
scharrx= cv2.convertScaleAbs(scharrx)#将像素值转化为绝对值
scharry = cv2.convertScaleAbs(scharry)#将像素值转化为绝对值
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)#融合图像

3.laplacian算子

laplacian算子是一个二阶算子,它可以直接计算出图像的边界,但缺点是对噪音点敏感,一般不会单独使用,需要配合其他函数处理图像。

opencv-python笔记2_第2张图片

import cv2
import numpy as np
import matplotlib.pyplot as plt
def cv2_imshow(name,img):#定义展示图像的函数
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
test1_gray = cv2.imread("test1.png",cv2.IMREAD_GRAYSCALE)#读入灰度图像
#laplacian算子处理梯度图像,对梯度变化速率更敏感,类似于二阶导
laplacian = cv2.Laplacian(test1_gray,cv2.CV_64F)#laplacian算子梯度处理灰度图像
laplacian = cv2.convertScaleAbs(laplacian)#将像素值转化为绝对值
cv2_imshow("laplacian",laplacian)#显示处理后的图像

canny边缘检测

img2 = cv.Canny(img,s1,s2)
//img为输入的灰度图像,s1,s2为低阈值,高阈值.

轮廓检测与绘制轮廓

1.common

1.
cv2.findContours(image, mode, method)
image:寻找轮廓的二值图像
mode:轮廓的检索模式
method:轮廓的近似办法
其中method与mode众多,,不一一列举
2.
cv2.drawContours(image, contours, contourIdx, color)
image:需要绘制轮廓的目标图像,会改变原图
contours:轮廓点,上述函数cv2.findContours()的第一个返回值
contourIdx:轮廓的索引,表示绘制第几个轮廓,-1表示绘制所有的轮廓
color:绘制轮廓的颜色

2.矩形


x,y,w,h = cv2.boundingRect(img)
img:一个二值图像
x,y:矩形左上角坐标
w,h:矩形宽高

图像金字塔

有两类图像金字塔:高斯金字塔和拉普拉斯金字塔。

使用函数cv2.pyrDown()和cv2.pyrUp()构建图像金字塔。

opencv-python笔记2_第3张图片


cv2.pyrDown()从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低)。

cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。

你可能感兴趣的:(笔记,学习记录,opencv,python,计算机视觉)