[OpenCV新手向]一个OpenCV颜色空间转化的实例
2012-07-09 17:25
218 查看
最近在OpenCV中文论坛上解答了个问题,大概问题是这样的,把下图中绿色的八卦部分抠出来:
可以看出问题解决方案很直接:遍历图片的每个像素,然后如果像素的颜色接近于绿色,保留此像素;反之遗弃,设值为0。解决思路跟photoshop的颜色选择功能类似。
问题主要的难点在于如何去比较颜色。输入图像的RGB色彩并不适用于颜色的比较;这里就要引入HSV色彩空间,把RGB颜色转化成H色相,S饱和度,V色调(亮度)。根据饼状图,我们发现绿色范围(转化成0~255区间)大概在35到90之间。所以,遍历过程中,我们留下H通道值在35~90范围内,并且饱和度和色调足够高(保证像素足够明亮)的像素;反之,剩下的我们认为是背景和噪点。
代码如下:
效果如下图:
可以看出问题解决方案很直接:遍历图片的每个像素,然后如果像素的颜色接近于绿色,保留此像素;反之遗弃,设值为0。解决思路跟photoshop的颜色选择功能类似。
问题主要的难点在于如何去比较颜色。输入图像的RGB色彩并不适用于颜色的比较;这里就要引入HSV色彩空间,把RGB颜色转化成H色相,S饱和度,V色调(亮度)。根据饼状图,我们发现绿色范围(转化成0~255区间)大概在35到90之间。所以,遍历过程中,我们留下H通道值在35~90范围内,并且饱和度和色调足够高(保证像素足够明亮)的像素;反之,剩下的我们认为是背景和噪点。
代码如下:
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; void getGreenMask(Mat& src, Mat& dst) { cvtColor(src, dst, cv::COLOR_BGR2HSV); int hi = 90, lo = 35; int lo_sat_v = 50; for(int i = 0; i < src.rows; i ++) { Vec3b * row_ptr = dst.ptr<Vec3b>(i); for(int j = 0; j < src.cols; j ++) { Vec3b hsv = row_ptr[j]; if((hsv[1] < lo_sat_v || hsv[2] < lo_sat_v) // 饱和度和亮度过低 || (hsv[0] > hi || hsv[0] < lo)) // 色相不在范围内 { row_ptr[j] = Vec3b::all(0); // 剔除不在范围内的像素 } } } cvtColor(dst, dst, cv::COLOR_HSV2BGR); } int main(int argc, char* argv[]) { Mat in = imread("F:/test.JPG"); namedWindow("green channel"); Mat out(in.size(), CV_8UC3, Scalar::all(0)); getGreenMask(in, out); imshow("green channel", out); waitKey(); return 0; }
效果如下图:
相关文章推荐
- [opencv自学笔记]颜色空间的转化
- 《OpenCV颜色空间及颜色空间相互转化》
- openCV—Python(7)—— 彩色图像R、G、B分量的提取与合并及其相关颜色空间的转化
- openCV—彩色图像R、G、B分量的提取与合并及其相关颜色空间的转化
- opencv2.4颜色空间转换
- 这篇很简单,只是一个新手发神经而已。关于oracle的date类型的格式转化。
- 黑莓开发新手入门教学帖,如何制作一个能控制LED颜色的程序(一)
- 使用OpenCV实现RGB、HSI、CMYK颜色空间的转换
- opencv之基于颜色空间的投影追踪
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- opencv学习(十六)之颜色空间转换cvtColor()
- OpenCV-基于YCrCb颜色空间的肤色检测
- 视频解码器和render之间增加一个内容透传的filter,需要处理颜色空间的差异及显卡内存自动对齐问题
- Silverlight+WCF 新手实例 象棋 棋手颜色(二十九)
- 【OpenCV学习笔记】【函数学习】五(颜色空间转换cvCvtColor()函数)
- OpenCV Using Python——RGB颜色空间和YCbCr颜色空间的混合肤色检测
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- opencv学习(三)之图像像素遍历(颜色空间缩减、查找表)
- opencv之Lab颜色空间的学习
- 【OpenCV】4th-基于YCrCb颜色空间的颜色识别