opencv 常用函数

返回指定形状和尺寸的结构元素

 cv2.getStructuringElement( )

这个函数的第一个参数表示内核的形状,有三种形状可以选择。

矩形:MORPH_RECT;

交叉形:MORPH_CROSS;

椭圆形:MORPH_ELLIPSE;

第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前

虚线转直线

ret, binary = cv2.threshold(cell_test, 245, 255, cv2.THRESH_BINARY_INV) #灰度值大于250取255,否则为0 INV 表示的是取反

element = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 3))  # 横向虚线
dilate_binary = cv2.dilate(binary,  element , iterations=3)

提取边缘信息

edged = cv2.Canny(gaussian_gray, 200, 255)  # Canny边缘检测

edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
edges 为计算得到的边缘图像。
image 为 8 位输入图像。
threshold1 表示处理过程中的第一个阈值。
threshold2 表示处理过程中的第二个阈值。

Canny 边缘检测分为如下几个步骤: threshold1 和 threshold2 的值较小时,能够捕获更多的边缘信息。

步骤 1:去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
步骤 2:计算梯度的幅度与方向。
步骤 3:非极大值抑制,即适当地让边缘“变瘦”。
步骤 4:确定边缘。使用双阈值算法确定最终的边缘信息。

高斯滤波

https://blog.youkuaiyun.com/godadream/article/details/81568844

gaussian_gray = cv2.GaussianBlur(gray, (3, 3), 0)  # 高斯滤波


gray = cv2.GaussianBlur(gray, (5, 7), 0) #  字体模糊了【blur1和blur2越大,图像的模糊程度越大。】
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)

src:输入的图像
ksize:高斯卷积核的大小。注意:卷积核的高度和宽度都应为奇数,且可以不同。
sigmaX:水平方向的标准差
sigmaY:垂直方向的标准差,默认值为0,表示与sigmaX相同
borderType:边界类型

找轮廓

contours, HIERARCHY = cv2.findContours(canny, cv2.RETR_EXTERNAL,
                                       cv2.CHAIN_APPROX_SIMPLE)

第一个参数是寻找轮廓的图像;二值图像

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

图像阈值处理二值化

ret, binary = cv2.threshold(img_gray, 127, 127, cv2.THRESH_BINARY)

src:表示的是图片源
thresh:表示的是阈值(起始值)
maxval:表示的是最大值
type:表示的是这里划分的时候使用的是什么类型的算法**,常用值为0(cv2.THRESH_BINARY)
在这里插入图片描述

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)

adaptiveThreshold是threshold的进阶版本。
threshold只是简单的把图像像素根据阈值区分,这样的二值区分比较粗糙。可能会导致图像的信息与特征完全无法提取,或者漏掉一些关键的信息
自适应阈值算法的核心是将图像分割位不同的区域,每个区域都计算阈值。
可以更好的处理复杂的图像。自适应阈值函数定义如下:去除背景提取前景方面,自适应阈值函数要有效很多。

canny = cv2.adaptiveThreshold(~cur_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                     cv2.THRESH_BINARY, 15, -5)
canny = cv2.Canny(cur_gray, 50, 255)  # 第一个阈值和第二个阈值 第一个值太大 会有缺口
canny = cv2.dilate(canny, cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)))

src:灰度化的图片
maxValue:满足条件的像素点需要设置的灰度值
adaptiveMethod:自适应方法。有2种:ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C
thresholdType:二值化方法,可以设置为THRESH_BINARY或者THRESH_BINARY_INV
blockSize:分割计算的区域大小,取奇数
C:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
dst:输出图像,可选

画轮廓图

void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )

函数参数详解:
其中第一个参数image表示目标图像,

第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,

第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,

第四个参数color为轮廓的颜色,

第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,

第六个参数lineType为线型,

第七个参数为轮廓结构信息,

第八个参数为maxLevel

图像拼接

纵向

image = np.vstack((img1, img2))

横向

image = np.concatenate([img1, img2], axis=1)

边界矩形

有两类边界矩形

cv2.boundingRect()
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

直边界矩形 一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转,所以边界矩形的面积不是最小的

rect = cv2.minAreaRect(cnt)  # 最小外接矩形 发牛(中心点坐标,(宽度,高度),旋转的角度)
box = cv2.boxPoints(rect)
box = np.int0(box)

旋转的边界矩形 这个边界矩形是面积最小的,因为它考虑了对象的旋转。
返回一个Box2D结构rect:(最小外接矩形的中心(x,y),(宽度,高度),旋转角度
① rect[0]返回矩形的中心点
② rect[1]返回矩形的长和宽,顺序一定不要弄错了,在旋转角度上有很重要的作用
③ rect[2]返回矩形的旋转角度

使用cv2.boxPoints()可获取该矩形的四个顶点坐标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值