无法更改图像Mat opencv中的所有像素
can't change all pixel in image Mat opencv
我有一张灰色图像,我想将该图像中的所有像素值更改为白色。
我试试这些代码:
int main(int argc, char** argv){
cv::Mat img = cv::imread("C:/mata.jpg");
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
img.at<uchar>(i, j) = 255;
}
}
imshow("result", img); }
图片尺寸:37 x 29
我检查了那个循环中的像素总数,结果,我可以访问所有像素,但不是所有像素都变成白色(只有四分之一的图像变成白色,其他的仍然具有与原始图像相同的颜色)。
谁能帮帮我?
您的图像可能是显示为灰度的 RGB 图像。这意味着每个通道共享相同的值,或者说红色、绿色和蓝色的值都相等。尝试以灰度读取图像,或执行从彩色到灰度的手动转换。
所以这样做:
int main(int argc, char** argv) {
cv::Mat img = cv::imread("C:/mata.jpg", cv::IMREAD_GRAYSCALE); // Change here
for (int i = 0; i < img.rows; i++)
for (int j = 0; j < img.cols; j++)
img.at<uchar>(i, j) = 255;
imshow("result", img);
}
...或者这样做:
int main(int argc, char** argv) {
cv::Mat img_colour = cv::imread("C:/mata.jpg"); // Change here
cv::Mat img;
cv::cvtColor(img_colour, img, cv::CV_BGR2GRAY); // Change
for (int i = 0; i < img.rows; i++)
for (int j = 0; j < img.cols; j++)
img.at<uchar>(i, j) = 255;
imshow("result", img);
}
正如其他答案和评论中所建议的那样,您将图像读取为 BGR 而不是灰度。
另一种方法适用于灰度和彩色图像,它可以完全避免手动循环并改为编写:
img.setTo(cv::Scalar::all(255));
或
img = cv::Scalar::all(255);
查看更多变体 here。
我有一张灰色图像,我想将该图像中的所有像素值更改为白色。
我试试这些代码:
int main(int argc, char** argv){cv::Mat img = cv::imread("C:/mata.jpg"); for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { img.at<uchar>(i, j) = 255; } } imshow("result", img); }
图片尺寸:37 x 29
我检查了那个循环中的像素总数,结果,我可以访问所有像素,但不是所有像素都变成白色(只有四分之一的图像变成白色,其他的仍然具有与原始图像相同的颜色)。
谁能帮帮我?
您的图像可能是显示为灰度的 RGB 图像。这意味着每个通道共享相同的值,或者说红色、绿色和蓝色的值都相等。尝试以灰度读取图像,或执行从彩色到灰度的手动转换。
所以这样做:
int main(int argc, char** argv) {
cv::Mat img = cv::imread("C:/mata.jpg", cv::IMREAD_GRAYSCALE); // Change here
for (int i = 0; i < img.rows; i++)
for (int j = 0; j < img.cols; j++)
img.at<uchar>(i, j) = 255;
imshow("result", img);
}
...或者这样做:
int main(int argc, char** argv) {
cv::Mat img_colour = cv::imread("C:/mata.jpg"); // Change here
cv::Mat img;
cv::cvtColor(img_colour, img, cv::CV_BGR2GRAY); // Change
for (int i = 0; i < img.rows; i++)
for (int j = 0; j < img.cols; j++)
img.at<uchar>(i, j) = 255;
imshow("result", img);
}
正如其他答案和评论中所建议的那样,您将图像读取为 BGR 而不是灰度。
另一种方法适用于灰度和彩色图像,它可以完全避免手动循环并改为编写:
img.setTo(cv::Scalar::all(255));
或
img = cv::Scalar::all(255);
查看更多变体 here。