图像二值化后提边缘效果不好?那是你不会用HSV色彩空间

本文介绍了一种在图像处理中使用HSV色彩空间进行边缘提取的方法。通过将图像从RGB转换到HSV空间,并对HSV三个通道进行加权融合,进而利用中值滤波和Canny算子实现高质量的边缘检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


        我们平时在做图像边缘提取的时候一般经常在RGB空间做图像二值化然后阈值处理后提取边缘,大多数情况是效果不错的,但是有些图像对比度和色彩区分度不是很好,那么RGB空间处理效果就不够用了。

        我们这这种情况下可转成HSV色彩空间,提取其三个维度的图像,然后做权重加和处理,再经过滤波后的直接canny出来的边缘效果会非常好。

        江湖我雷哥,人狠话不多,桑代码:

cv::Mat HSV;
cv::cvtColor(imgSmall, HSV, COLOR_BGR2HSV);
std::vector<cv::Mat> splitImage;
cv::split(HSV, splitImage);
cv::Mat H, S, V;

H = splitImage[0];
S = splitImage[1];
V = splitImage[2];

cv::Mat addImage = 0.3 * V + 0.7 * H; //加权融合处理
//cv::addWeighted();
cv::Mat filter;

cv::Mat filter_v = 255 - addImage; //前景目标为白色
cv::medianBlur(filter_v, filter, 9); //中值滤波使边缘均衡清晰
cv::threshold(filter, imgThresh, 190, 255, THRESH_BINARY);
cv::Canny(imgThresh, imgCny, mControlParams_[0], mControlParams_[1], mControlParams_[2], true);

效果图那是贼棒!

(加权滤波后的图 )

 

 (canny后的效果图)

边缘提取这一块,你说气人不!!!

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】 

交通标志识别系统标准完全模板HSV定位基础版-二值化模板.rar 本帖最后由 hcq@@ 于 2013-7-7 11:04 编辑 1、交通标志(警示牌类),其外框一般为红色,所以定位时可采用HSV颜色模型或者RGB颜色模型来取红色区域,通过regiongroup标记进一步取目标区域。 HSV颜色模型:I1=Hsv; %记录颜色亮度为1的数据,以便之后再利用颜色阀值找出红色 figure,imshow;title'); BW=roicolor; %利用颜色阀值将红色对象都都显示为白色,其余都为黑色,至此完成图象的二值化 figure,imshow;title; 复制代码具体参考附件HSV取基础版.rar RGB颜色模型 IR=double; IG=double; IB=double; for i=1:chang for j=1:kuan if 1.6*IR-IG-IB255 CA=255; else CA=1.6*IR-IG-IB; end end end figure;imshow;title; 复制代码经过对比,对于目标边界清晰的图片,RGB颜色模型的效果很不错,结果在贴图中。 2、分割出来的交通标志,为了便于二值化处理,强烈建议将背景黑色转成白色,这里标准模板只处理了20几张(考虑到可能用不到这么多的模板),如果有需要,可采取灰度—二值化—反色—擦除边缘—归一化步骤,即可处理成新的模板。代码在 附件里面: 3、识别的时候,可先建立数组,和普通的识别方法一样的,识别结果可采取msgbox的显示方法(即根据返回的匹配索引,得出结果)。if x==1 msgbox;end if x==2 msgbox;end if x==3 msgbox;end if x==4 msgbox;end 。。。。。。。同理 复制代码
将RGB图像转换为HSV颜色空间后,可以利用H(色调)、S(饱和度)以及V(亮度)三个通道的信息来进行更有效的二值化处理。以下是步骤及原理: ### 步骤说明 1. **从RGB到HSV** 首先需要将输入的RGB彩色图像转换成HSV颜色模型。这是因为在某些场景下,比如检测特定的颜色范围(如红色、绿色等),HSV比RGB更适合用于描述颜色。 2. **设定阈值范围** 根据目标物体的颜色特性,在HSV色彩空间内选择合适的区间作为阈值条件。例如对于红色区域,可能需要考虑两个独立的小段(因为红在HSV圆环上靠近两端)。通常来说, - H(色调):确定颜色种类,取值一般位于[0, 360]或者标准化后的 [0, 1] - S(饱和度):表示颜色纯度,越高越鲜艳;低则接近灰色 - V(明度/亮度):反映光照强度 假设我们希望取黄色部分,则可以根据经验设置大致阈值 `[H_low,H_high], [S_low,S_high],[V_low,V_high]` 来限定感兴趣的目标色块位置。 3. **创建掩码 Mask** 使用上述选定的HSV上下限生成一个布尔型数组即掩模(mask),其中满足指定条件的位置会被标记为True(白色),其余都置False(黑色)。 4. **应用掩膜得到结果图** 把该mask作用回原始图片之上就实现了只保留符合条件的部分并将其余背景去除的效果——这就是所谓的“图像二值化”。 5. **进一步优化边缘平滑或其他操作** 如果必要的话还可以添加形态学运算像腐蚀膨胀消除噪声点之类的后期修正手段改善最终效果。 --- #### 示例代码 (Python + OpenCV) ```python import cv2 import numpy as np # 加载原图 img = cv2.imread('image.jpg') hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义蓝色的 HSV 范围 lower_blue = np.array([100,50,50]) upper_blue = np.array([130,255,255]) # 创建遮罩 mask,并对原图进行按位与操作获得分割结果 mask = cv2.inRange(hsv_img, lower_blue, upper_blue) res = cv2.bitwise_and(img,img, mask= mask) cv2.imshow("Result", res) cv2.waitKey(0) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值