图像处理之RGB转为HSV

本文详细介绍了如何将RGB颜色模型转换为HSV颜色模型,并通过具体的C语言代码示例展示了这一过程。文中还提供了一种利用HSV模型保留图像中红色部分的方法。

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

从 RGB 到 HSL 或 HSV 的转换

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:


上面的理论也是从别人那里直接拷贝过来的,基本的理论知识就在上面。

static int rgb2hsv_max(int a,int b,int c)
{
	int max = a;
	if(b > max) max = b;
	if(c > max) max = c;
	return max;
}

static int rgb2hsv_min(int a,int b,int c)
{
	int min = a;
	if(b < min) min = b;
	if(c < min) min = c;
	return min;
}

static int rgb2hsv(int r,int g,int b,int *h,int *s,int *v)
{
	int imax,imin,diff;
	imax = rgb2hsv_max(r,g,b);
	imin = rgb2hsv_min(r,g,b);
	diff = imax - imin;
	*v = imax;
	if(imax == 0)
		*s = 0;
	else
		*s = diff;

	if(diff != 0)
	{
		if(r == imax)
		{
			*h = 60 * (g - b) / diff;
		}
		else if(g == imax)
		{
			*h = 60 * (b - r) / diff + 120;
		}
		else
		{
			*h = 60 * (r - g) / diff + 240;
		}

		if(*h < 0)
			*h = *h + 360;
	}
	else
		*h = -1;

	return 0;
}
这里采用hsv保留图像中的红色,滤除其他颜色:

static int RED_COLOR(int r,int g,int b)
{
	int h,s,v;
	rgb2hsv(r,g,b,&h,&s,&v);
	if((h > 0 && h < 16) || (h > 240 && h < 360))
		return 1;
	return 0;
}
运行结果:



RGB图像转换为HSV颜色空间后,可以利用H(色调)、S(饱和度)以及V(亮度)三个通道的信息来进行更有效的二值化处理。以下是步骤及原理: ### 步骤说明 1. **从RGBHSV** 首先需要将输入的RGB彩色图像转换成HSV颜色模型。这是因为在某些场景下,比如检测特定的颜色范围(如红色、绿色等),HSVRGB更适合用于描述颜色。 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、付费专栏及课程。

余额充值