根据阈值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。然而,我想显示与蓝色和红色图像重叠的原始图像。我不知道该怎么做,或者我是否采取了最好的方法。

我知道我无法添加图像,因为我想确保高于阈值的每个像素都是纯红色,而不是红色和原始图像的混合,这会产生粉红色像素而不是亮红色像素,这违背了我正在尝试构建的目的。但就目前而言,我有点不知道该怎么做。

【问题讨论】:

使用lowThreshhighThresh作为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中访问某个图像中所有像素的RGB值

使用 OpenCV 修改图像时 RGB 值错误

OpenCV实战 | 一文剖析图像阈值化方法——adaptiveThreshold thresholdTHRESH_OTSU

OpenCV实战 | 一文剖析图像阈值化方法——adaptiveThreshold thresholdTHRESH_OTSU

OpenCV实战 | 一文剖析图像阈值化方法——adaptiveThreshold thresholdTHRESH_OTSU