文章目录
- 计算机中图片构成红绿蓝
- 边界填充
- 色彩图片转二值图
- 腐蚀操作
- sobel算子
- 滤波
- 图像阈值函数
- 边缘检测
- 轮廓检测
- 轮廓特征与轮廓近似
- 轮廓特征
- 轮廓近似
计算机中图片构成红绿蓝
图片由像素点构成,每个像素点有三个通道,分别是RGB,对应红绿蓝颜色,映射到计算机可以处理的数值是:每个通道取值0~255,0表示最暗、255最亮。通过调节每个通道占比,可以实现不同颜色的控制。
但是需要注意的是cv中通道顺序是BGR,要与其他包的区分开
边界填充
img = cv2.imread(img_address)
top_,bottom_,left_,right_ = (50,50,50,50)
# 其实就是一个函数,最后面选择的模式不一样
# BORDER_REPLICATE:复制法,也就是复制最边缘像素。
# ·BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制 fedcba | abcdefgh | hgfedcb
# BORDER_REFLECT101,上一种方法的优化版,去掉了边界 cdefgh|abcdefgh|abcdefg
# BORDER_WRAP: 外包装法cdefgh|abcdefgh|abcdefg
# BORDER_CONSTANT:常量法,常数值填充
replicate = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_WRAP)
const = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_CONSTANT,value=0)
cv2.imshow('1',replicate)
cv2.imshow('2',reflect)
cv2.imshow('3',reflect101)
cv2.waitKey(0)
cv2.destroyAllWindows()
色彩图片转二值图
彩色图片转二值图步骤是 : 色彩 ——> 灰度 ——> 二值
彩色图片通常有多个通道,灰度、二值仅有一个。
灰度图像是单通道图像,该通道叫啥名不知道,而彩色图片的通道叫R、G、B,该通道内灰度图像取值为0到255,而二值图像是非0即255,很明显具有一层一层的关系,所以是这个步骤
另外一般是先将彩色图化为灰度,再二值,当然也可以直接彩色图二值,但是这样的跳跃会造成颜色信息的损失,所以最好按照这个步骤。
实现代码:
效果:
腐蚀操作
对于二值图像,取一个一定体积的卷积盒(n*n像素区域),把图像中每个区域框起来,如果框起来的里面即有黑又有白,则此区域被腐蚀,以此达到细化图片、文字,除去细小杂点
具体函数cv2.erode,参数: 读取后的图片(数组),卷积盒大小,迭代次数:腐蚀多少次
但是以我的了解腐蚀操作好像只能腐蚀黑底白字,如果是另一种颜色就会导致相反的结果,所以想到了二值反转
效果大概这样,又白底黑字转黑底白字
sobel算子
该算子功能是计算某点梯度,可以看到算子矩阵中元素有数值差距,其实就是用这种方法表示离取的这个点的距离,然后与像素矩阵做内积就得到一个标量,这个标量就作为这么一点的像素,所以图片又被处理了。
实际上我们想象矩阵是p1~p9,然后内积就是对应元素做乘积,所以就变成了右边像素-左边像素(如下图),但是不一定是正值,所以要绝对值处理,要不然变成负号就截断为0了
实操:
ksize:很明显这里的算子是3x3的
滤波
高斯
中值
图像阈值函数
可用于生成二值图片
边缘检测
这一次边缘检测把前面知识融合起来了,一套组合拳处理出一个很完美的边界
1)高斯滤波器:其实也就和sobel有点像,一个算子内积于像素矩阵,得到的值就是该点的滤波结果,可以很好消除噪音点
2)计算梯度这个可以用到sobel算子,方向计算只要x、y的梯度值得到,方向就直接反三角函数就行
在这里插入图片描述
3)非极大值抑制
由梯度计算出来的图像边缘很模糊(或者说比较混杂),在其边缘有很多梯度点,我们力求用一条清晰苗条的边缘线来画出这个边缘,我们引出一个方法叫非极大值抑制
4)双阈值检测
这个算法是先计算每一点的梯度,然后设置两个阈值,小于舍弃,大于保留且处理为边界,在之间如果有点(梯度不为0点,这时候已经经过前面很多步的处理,这时梯度不为0点不多)连接边界像素点,则保留视为边缘点
轮廓检测
边缘检测并不是轮廓检测,这个要区分开,边缘检测关注的是图像中亮度或颜色的变化,轮廓检测的关注的是物体的形状信息。
源码及解释:得到轮廓信息不要在灰度或二值图像上画出,因为不明显,可以copy一下在原img中显示
轮廓特征与轮廓近似
轮廓特征
轮廓特征是指用findcontours函数得到的返回值轮廓信息(contours)具有的一些特征,因为画出的轮廓不止一个,可以用取下标的方式访问每个轮廓,并进行操作
注意:要操作返回的轮廓信息,只能访问一个轮廓,不要一股脑把返回的轮廓信息全部传进去
特征1:轮廓面积值
特征2:轮廓周长
轮廓近似
轮廓近似(Contour Approximation)是指将连续曲线或轮廓抽象为一系列更简单的曲线或线段的过程,可用于轮廓提取
轮廓近似可以用这个函数直接自动绘制适应的轮廓,也可以直接画自己想要的框。