Я пытаюсь изменить цвет фона с белого на черный. Итак, я пытаюсь пройтись по всем пикселям и проверить, является ли он белым или нет, если да, измените значение на 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

0
Jed 13 Мар 2018 в 10:30

2 ответа

Лучший ответ

Если вы хотите перебирать пиксель за пикселем, измените цикл для этого:

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);
1
Yanet 13 Мар 2018 в 14:25

Из этого кода

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
Aleksey Petrov 13 Мар 2018 в 08:19