Gitee地址:https://gitee.com/jzhou955/edge_detection.git
欢迎star or fork。

项目需求

  1. 检测图片中特定部分的轮廓。
  2. 单纯用边缘提取算子处理图片得到的效果并不理想。由于图片边缘两边的颜色差异较大,考虑用色域分离的方法进行边缘提取。

项目记录

  • RGB:

    • RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R ),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。
    • RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间,比较容易理解。
    • RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
    • 自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。
    • 但是人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。
    • 所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。
  • HSV:

    • 在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体
    • HSV 表达彩色图像的方式由三个部分组成:
      • Hue(色调、色相)
      • Saturation(饱和度、色彩纯净度)
      • Value(明度)
    • 用下面这个圆柱体来表示 HSV 颜色空间,圆柱体的横截面可以看做是一个极坐标系 ,H 用极坐标的极角表示,S 用极坐标的极轴长度表示,V 用圆柱中轴的高度表示。

  • Hue 用角度度量,取值范围为0~360°,表示色彩信息,即所处的光谱颜色的位置,表示如下:

  • 颜色圆环上所有的颜色都是光谱上的颜色,从红色开始按逆时针方向旋转,Hue=0 表示红色,Hue=120 表示绿色,Hue=240 表示蓝色等等。
  • 在 GRB中 颜色由三个值共同决定,比如黄色为即 (255,255,0);在HSV中,黄色只由一个值决定,Hue=60即可。
  • HSV 圆柱体的半边横截面(Hue=60):

  • 其中水平方向表示饱和度,饱和度表示颜色接近光谱色的程度。饱和度越高,说明颜色越深,越接近光谱色饱和度越低,说明颜色越浅,越接近白色。饱和度为0表示纯白色。取值范围为0~100%,值越大,颜色越饱和。竖直方向表示明度,决定颜色空间中颜色的明暗程度,明度越高,表示颜色越明亮,范围是 0-100%。明度为0表示纯黑色(此时颜色最暗)。

  • 可以通俗理解为:在Hue一定的情况下,饱和度减小,就是往光谱色中添加白色,光谱色所占的比例也在减小,饱和度减为0,表示光谱色所占的比例为零,导致整个颜色呈现白色。明度减小,就是往光谱色中添加黑色,光谱色所占的比例也在减小,明度减为0,表示光谱色所占的比例为零,导致整个颜色呈现黑色。

  • HSV 对用户来说是一种比较直观的颜色模型。我们可以很轻松地得到单一颜色,即指定颜色角H,并让V=S=1,然后通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到浅蓝色,V=1 S=0.4 H=240度。

  • HSV 的拉伸对比度增强就是对 S 和 V 两个分量进行归一化(min-max normalize)即可,H 保持不变。

  • RGB颜色空间更加面向于工业,而HSV更加面向于用户,大多数做图像识别这一块的都会运用HSV颜色空间,因为HSV颜色空间表达起来更加直观!

  • 参考链接:

    • 三分钟带你快速学习RGB、HSV和HSL颜色空间.
    • 在OpenCV + Python中使用色彩空间进行图像分割.
    • 利用openCV+python进行HSV颜色识别.

OpenCV函数解析

  • cv.cvtColor

    • cv2.cvtColor(image, code, dst, dstCn)。
    • 将输入图像从一个色彩空间转换到另一个色彩空间。在处理RGB图像时要注意色彩通道的顺序(RGB或BGR)。opencv中的默认色彩空间实际是BGR,但是常常以RGB提及。
    • 我们可以将四个参数传递给CVTColor()方法。在四个参数中,前2(图像和代码)是强制性的;休息(DST和DSTCN)是可选的。
    • 必要的参数是:
      • image:n维数组的源/输入图像。
      • code:颜色空间的转换代码。
    • 可选参数是:
      • dst:输出与源相同大小和深度的图像。
      • dstCn:目标图像中的通道数。如果将参数置为0,则会自动从图像和代码获取通道的数量。
    • 如果对8-bit images使用cvtColor()函数,转换会丢失部分信息,一般不明显。推荐先将图像转换成32-bit images,再进行色彩空间转换,最后再把图像转换成8-bit images。
    • 如果转换后添加了透明通道,其值会被设置为对应通道取值范围的最大值(255 for CV_8U, 65535 for CV_16U, 1 for CV_32F)。
  • cv.inRange

    • cv2.inRange(src, lower_bound, upper_bound)。
    • 可以提取想要的颜色并把该颜色的区域设置为白色,其余的设置为黑色。
    • 原理为输入图像中,该函数会扫描图片的每个像素的值。如果相对应的像素值都在两个输入数组相对应的数值内,那么这个像素会被设置为白色(255)。否则就会设置为黑色(0)。
    • 请注意:该函数输出的dst是一幅二值化之后的图像。
  • cv.bitwise_and

    • bitwise_and(src1, src2, dst=None, mask=None)。
    • src1、src2:为输入图像或标量,标量可以为单个数值或一个四元组
    • dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同
    • mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。返回值为结果图像矩阵,如果dst传入了实参,则返回值与dst对应 实参相同。
    • 输入图像与输入图像在掩模条件下按位与,得到掩模范围内的原图:img_specifiedColor=cv.bitwise_and(img,img,mask=img_yellow)

相关代码

def colorMask(img):img = cv.cvtColor(img, cv.COLOR_BGR2RGB)hsv_img = cv.cvtColor(img, cv.COLOR_RGB2HSV)light_orange = (11,43,46)dark_orange = (25,255,255)light_white = (0,0,0)dark_white = (180,255,46)orange_mask = cv.inRange(hsv_img,light_orange,dark_orange)white_mask = cv.inRange(hsv_img,light_white,dark_white)mask = orange_mask+white_mask# mask = white_mask# cv.imwrite('/Users/vine/Desktop/2mask.jpg', mask)return mask
def colorMask2(img):#转变为HSV颜色空间# img_hsv=cv.cvtColor(img,cv.COLOR_BGR2HSV)#返回黄色区域的二值图像# img_yellow=cv2.inRange(img_original,(100,43,46),(125,255,255)) # 蓝色img_yellow=cv.inRange(img,(0,0,0),(180,255,46)) # 黑色# img_yellow=cv2.inRange(img_original,(0,43,46),(10,255,255)) # 红色# img_yellow=cv2.inRange(img_original,(0,43,46),(34,255,255)) # 红色##输入图像与输入图像在掩模条件下按位与,得到掩模范围内的原图像img_specifiedColor=cv.bitwise_and(img,img,mask=img_yellow)# cv.imwrite('/Users/vine/Desktop/colorMask11.jpg', img_specifiedColor)return img_specifiedColor

【openCV边缘检测】用传统方法实现边缘检测(二)色彩空间相关推荐

  1. OpenCV入门(四)——边缘检测

    目录 0x01 梯度算子 0x02 一阶微分算子 0x03 二阶微分算子 0x04 图像差分运算 0x05 非极大值抑制 0x06 基本边缘算子--Sobel 0x07 基本边缘算子--Laplace ...

  2. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  3. 用matlab进行边缘检测,用Matlab进行边缘检测

    用Lena标准检测图像,图像与代码下面注明了是哪张图像. 一.没有噪声时的检测结果 1 原始图像 2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Lap ...

  4. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...

  5. 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 灰度图像的二维傅里叶变换(cv_gray_fft ...

  6. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  7. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  8. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  9. 【OpenCV 例程200篇】73. 二维连续傅里叶变换

    [OpenCV 例程200篇]73. 二维连续傅里叶变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 2.1 二维 ...

  10. Jetson Nano 从入门到实战(转载)(案例:Opencv配置、人脸检测、二维码检测)

    目录 1. Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 ...

最新文章

  1. Spec Explorer 工具学习
  2. python编写爬虫的步骤-用Python编写一个简单的爬虫
  3. Chrome——我的Chrome插件
  4. linux 找不到php命令,bash scp:未找到命令的解决方法
  5. 【参与开源】J2EE开源项目JEECG快速开发平台,欢迎广大技术爱好者参与
  6. Raft -【go一致性算法】
  7. ES6-ES11新特性_ECMAScript相关名词介绍_---JavaScript_ECMAScript工作笔记002
  8. MQ队列管理器_PMTS命令
  9. ProgressBar 圆形进度条
  10. 一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取
  11. mac版docker配置加速
  12. 吉林大学计算机学院控制与应用实验室,2019计算机考研吉林大学国家物联网虚拟仿真实验教学中心简...
  13. 中文转拼音全拼和首字母
  14. 二级分销系统对企业来说意味着什么?
  15. uniapp如何分享文件到微信 文件分享
  16. oracle 按照固定顺序排序
  17. Android高德地图踩坑记录-内存泄漏问题
  18. Tomcat7 配置Https双向证书认证
  19. Akka 指南 之「消息传递可靠性」
  20. elasticsearch 安装配置

热门文章

  1. python curses_Py之curses:curses库的简介、使用、安装方法详细攻略
  2. Gstreamer学习流水账
  3. “抛砖引玉”晒Jncip-sp证书寻Jncie-sp战友
  4. 在线伪原创代写工具文章生成器
  5. html背景图片内填充,CSS基础——使用图片填充元素背景
  6. 需求基线的划定与管理
  7. vue给标签动态添加元素_vue页面动态添加元素
  8. c++运行时报错terminate called after throwing an instance of ‘std::bad_alloc‘
  9. Java实现图章或签名插在pdf的固定位置
  10. 好用的企业邮箱服务都有哪些好处