我正在尝试将背景颜色从白色更改为黑色。所以我试图通过所有像素并检查它是否为白色或者如果是,则将值更改为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);
这是我要转换的图片
答案 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);