将背景颜色从白色更改为黑色时出错

时间:2018-03-13 07:30:36

标签: opencv image-processing

我正在尝试将背景颜色从白色更改为黑色。所以我试图通过所有像素并检查它是否为白色或者如果是,则将值更改为0.但是出了点问题。

这是我的代码

Mat img = imread("t.PNG");
for (int x = 0; x < img.rows; x++)
{
    for (int y = 0; y < img.cols; y++)
    {
        if (img.at<Vec3b>(Point(x, y))[0] >=245 && img.at<Vec3b>(Point(x, y))[1] >= 245 && img.at<Vec3b>(Point(x, y))[2] >= 245)
        {

            img.at<Vec3b>(Point(x, y)) = { 0,0,0 };
        }       
    }   
}
imwrite("img.png",img);
imshow(" ",img);
waitKey(0);

这是我要转换的图片

enter image description here

2 个答案:

答案 0 :(得分:1)

从此代码中

for (int x = 0; x < img.rows; x++)
{
    for (int y = 0; y < img.cols; y++)
    {

x - 是行号,y是列号,但是来自以下代码:

img.at<Vec3b>(Point(x, y))

x是列号,y是行号。

所以,你应该改变循环中的变量。

答案 1 :(得分:1)

如果您想逐个像素地迭代,请更改此循环:

for (int row = 0; row < img.rows; row++)
{
    for (int col = 0; col < img.cols; col++)
    {
        if (img.at<cv::Vec3b>(cv::Point(col, row))[0] >=245 && img.at<cv::Vec3b>(cv::Point(col, row))[1] >= 245 && img.at<cv::Vec3b>(cv::Point(col, row))[2] >= 245)
        {
            img.at<cv::Vec3b>(cv::Point(col, row)) = { 0,0,0 };
        }
    }
}

更好更明确的解决方案是使用背景蒙版。为此改变循环:

cv::Mat gray,mask;
cv::cvtColor(img,gray,CV_BGR2GRAY);
cv::compare(gray, cv::Scalar(245,245,245), mask, CV_CMP_GT);
img.setTo(cv::Scalar(0,0,0), mask);