Opencv中RGB通道/HSV通道并分离
将原图分离为RGB单通道和B三通道(GR通道均为0)
1 Mat src_color = imread(path); 2 vector<Mat> channels; 3 vector<Mat> mbgr(3); 4 split(src_color, channels); 5 Mat B = channels.at(0); 6 Mat G = channels.at(1); 7 Mat R = channels.at(2); 8 Mat bk1(src_color.size(), CV_8UC1, Scalar(0)); 9 Mat imageB(src_color.size(), CV_8UC3); 10 mbgr[0] = B; 11 mbgr[1] = bk1; 12 mbgr[2] = bk1; 13 merge(mbgr, imageB); 14 imshow("imageB", imageB); 15 imshow("原图", src_color); 16 imshow("B", B); 17 imshow("G", G); 18 imshow("R", R); 19 waitKey(0);
利用opencv把RGB图片像HSV颜色空间转变的时候,H通道的值范围为: 0-180,S: 0-255,V:0-255。
利用直方图显示三个通道的时候,H通道都集中在前半部分,想让它取值范围扩大。后来发现了 CV_BGR2HSV_FULL ,CV_BGR2HSV 在转换图像的时候是将 H / 2 ---> H ,我们知道图像中色相H的取值范围为 0-360 ,所以利用opencv转换之后得到的H的范围为 0-180。而 CV_BGR2HSV_FULL 实现的映射是 H * 255 / 360 --->H , 所以利用_FULL 这个转换得到的H通道图像的范围为 0-255这两种方式都是opencv把[0-360] 的数据压缩到一个字节可以处理的数据。[ 所以这里说的图像的depth = 8, 刚好能表示的最大值是 255]
1 Mat src_hsv; 2 cvtColor(src_color, src_hsv, CV_BGR2HSV_FULL); 3 //cvtColor(src_color, src_hsv, CV_BGR2HSV); 4 vector<Mat> hsv_channels; 5 split(src_hsv, hsv_channels); 6 Mat H = hsv_channels.at(0); 7 Mat S = hsv_channels.at(1); 8 Mat V = hsv_channels.at(2); 9 imshow("H", H); 10 imshow("S", S); 11 imshow("V", V);