根据阈值OpenCV C++改变像素的RGB值
Posted
技术标签:
【中文标题】根据阈值OpenCV C++改变像素的RGB值【英文标题】:Change RGB value of pixel based on threshold OpenCV C++ 【发布时间】:2017-07-26 19:18:59 【问题描述】:我有一张图像,其中高于某个值的像素我想变成红色,低于某个值的像素我想变成蓝色。
到目前为止,我可以通过使用阈值和按位运算符来设置像素值,得到一个红色像素矩阵和一个蓝色像素矩阵:
cvtColor(displayImage, displayImage, COLOR_GRAY2BGR);
threshold(displayImage, highThresh, highThreshVal, 255, 0);
highThresh = highThresh & Scalar(0, 0, 255); // Turn it red
threshold(displayImage, lowThresh, lowThreshVal, 255, 1);
lowThresh = lowThresh & Scalar(255, 0, 0); // Turn it blue
displayImage = lowThresh + highThresh;
当我显示displayImage
时,我几乎看到了我想要的内容。这是一个图像,其中lowThreshVal
下方的所有像素都是蓝色的,highThreshVal
上方的所有像素都是红色的。但是,介于这些值之间的像素都设置为 0。然而,我想显示与蓝色和红色图像重叠的原始图像。我不知道该怎么做,或者我是否采取了最好的方法。
我知道我无法添加图像,因为我想确保高于阈值的每个像素都是纯红色,而不是红色和原始图像的混合,这会产生粉红色像素而不是亮红色像素,这违背了我正在尝试构建的目的。但就目前而言,我有点不知道该怎么做。
【问题讨论】:
使用lowThresh
和highThresh
作为cv::Mat::setTo
的掩码
【参考方案1】:
这行得通。
cvtColor(displayImage, displayImage, COLOR_GRAY2BGR);
origImage = displayImage.clone();
threshold(origImage, highThresh, highThreshVal, 255, 0); // Binary thresholding
cvtColor(highThresh, highThresh, CV_BGR2GRAY);
displayImage.setTo(Scalar(0, 0, 255), highThresh);
threshold(origImage, lowThresh, lowThreshVal, 255, 1); // Binary thresholding
cvtColor(lowThresh, lowThresh, CV_BGR2GRAY);
displayImage.setTo(Scalar(255, 0, 0), lowThresh);
【讨论】:
以上是关于根据阈值OpenCV C++改变像素的RGB值的主要内容,如果未能解决你的问题,请参考以下文章
opencv C++ 三重for循环遍历RGB图像像素(逐像素操作操作像素值遍历像素遍历)
OpenCV实战 | 一文剖析图像阈值化方法——adaptiveThreshold thresholdTHRESH_OTSU
OpenCV实战 | 一文剖析图像阈值化方法——adaptiveThreshold thresholdTHRESH_OTSU
OpenCV实战 | 一文剖析图像阈值化方法——adaptiveThreshold thresholdTHRESH_OTSU