opencv图片处理基础

计算机中图片构成红绿蓝

图片由像素点构成,每个像素点有三个通道,分别是RGB,对应红绿蓝颜色,映射到计算机可以处理的数值是:每个通道取值0~255,0表示最暗、255最亮。通过调节每个通道占比,可以实现不同颜色的控制。
颜色对应RGB数值

但是需要注意的是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)是指将连续曲线或轮廓抽象为一系列更简单的曲线或线段的过程,可用于轮廓提取
轮廓近似可以用在这里插入图片描述这个函数直接自动绘制适应的轮廓,也可以直接画自己想要的框。

在这里插入图片描述

相关推荐

  1. OpenCV-图像基础处理

    2024-03-24 05:58:03       20 阅读
  2. ROS OpenCV 图像基本处理函数

    2024-03-24 05:58:03       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 05:58:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 05:58:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 05:58:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 05:58:03       20 阅读

热门阅读

  1. Python编程异步爬虫——协程的基本原理

    2024-03-24 05:58:03       19 阅读
  2. Scala第十一章节(正则表达式和异常处理)

    2024-03-24 05:58:03       15 阅读
  3. Python XML 解析

    2024-03-24 05:58:03       20 阅读
  4. 特种兵旅游-扬州、南京

    2024-03-24 05:58:03       15 阅读
  5. vue3之声明式和编程式导航

    2024-03-24 05:58:03       21 阅读
  6. 5.83 BCC工具之tcplife.py解读

    2024-03-24 05:58:03       19 阅读
  7. creator-webview与Android交互

    2024-03-24 05:58:03       19 阅读
  8. 2024最新华为OD机试试题库全 -【贪心歌手】- C卷

    2024-03-24 05:58:03       20 阅读