基于HSV的颜色渐变

最近在学习颜色识别,openCV里颜色识别要用到HSV模型,但对HSV模型不熟悉,因此写了一个基于HSV的颜色展示小程序

关于HSV

在openCV里,H∈[0,179],S∈[0,255],V∈[0,255].不明白为什么H的取值范围这么少,这样在HSV2BGR的时候是会丢失一部分颜色的。

#define ROWS 256
#define COLS 180
for(k=0;k<256;k++){
		for(j=0;j<ROWS;j++){
			for(i=0;i<COLS;i++){
				*(colorsrc.data+colorsrc.step[0]*j+colorsrc.step[1]*i)=i;
				*(colorsrc.data+colorsrc.step[0]*j+1+colorsrc.step[1]*i)=j;
				*(colorsrc.data+colorsrc.step[0]*j+2+colorsrc.step[1]*i)=k;

			}
		}
访问Mat的像素可以用 官方帮助文档给出的办法,以下是Mat储存二维数据方式


那data,step[0],step[1]指的是什么呢,data很容易看出来,是一个指向像素地址的指针。但如果要访问特定像素的地址,则需要用到step[0],step[1]

step[0]=列数*通道数,即图像一行含有多少个8位数据

step[1]=通道数

上面的方法是访问特定像素第一个通道的方法,如果要访问其他通道,则地址=+(通道-1)

//访问该像素的第三个通道
*(colorsrc.data+colorsrc.step[0]*j+colorsrc.step[1]*i)=k;
在生成图片之后,如果想把图片显示出来,要先把HSV转换成BGR才能显示。因为openCV默认以RGB显示图片

cvtColor(colorsrc,colordst,CV_HSV2RGB);
imshow("colordst",colordst);

最后,送上完整代码

#include "opencv2/opencv.hpp"
#include "iostream"
using namespace cv;
using namespace std;

#define ROWS 256
#define COLS 180

int main() {
	Mat colorsrc=Mat(ROWS,COLS,CV_8UC3);
	Mat colordst;
	int i,j,k;

	for(k=0;k<256;k++){
		for(j=0;j<ROWS;j++){
			for(i=0;i<COLS;i++){
				*(colorsrc.data+colorsrc.step[0]*j+colorsrc.step[1]*i)=i;//访问某像素的第一个通道
				*(colorsrc.data+colorsrc.step[0]*j+1+colorsrc.step[1]*i)=j;//第二个通道
				*(colorsrc.data+colorsrc.step[0]*j+2+colorsrc.step[1]*i)=k;//第三个

			}
		}
		cvtColor(colorsrc,colordst,CV_HSV2RGB);
		imshow("colordst",colordst);
		waitKey(100);
	}

	return 0;
}

运行截图



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值