无法更改图像 Mat opencv 中的所有像素

Posted

技术标签:

【中文标题】无法更改图像 Mat opencv 中的所有像素【英文标题】:can't change all pixel in image Mat opencv 【发布时间】:2015-04-13 06:13:50 【问题描述】:

我有一张灰色图像,我想将该图像中的所有像素值更改为白色。

我试试这些代码:

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

我检查了该循环中的总像素,结果,我可以访问所有像素,但图像中的所有像素都不会变成白色(只有四分之一的图像变成白色,其他的仍然有与原始图像相同的颜色)。

谁能帮帮我?

【问题讨论】:

您的图像不是灰度的。它被加载为 3 通道图像。试试这个:cv::Mat img = cv::imread("C:/mata.jpg", cv::IMREAD_GRAYSCALE); 您确定您的图像是灰度图像吗?...还是所有分量都相等的 RGB 图像? 我试过 imread("image", CV_BGR2GRAY) 但结果相同。 @sgarizvi 它有效!谢谢.. :) @anne 正确的语法是imread("image", 0) 你使用的标志,用于转换图像。 【参考方案1】:

正如其他答案和 cmets 所建议的那样,您正在将图像读取为 BGR 而不是灰度。 另一种适用于灰度和彩色图像的方法是完全避免手动循环并改为编写:

img.setTo(cv::Scalar::all(255));

img = cv::Scalar::all(255);

查看更多变体here。

【讨论】:

非常好的优化。 +1。【参考方案2】:

您的图像可能是显示为灰度的 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); 

【讨论】:

以上是关于无法更改图像 Mat opencv 中的所有像素的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 访问 MAT 对象中的 RGB 值

如何在opencv中更改实验室垫中的像素

如何将OpenCV Mat的所有像素设置为特定值?

openCV中的mat动画

使用 OpenCV 多通道 Mat 沿通道方向访问像素

如何访问二进制 Mat 图像中的像素值?