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

时间:2015-04-13 06:13:51

标签: c++ image opencv image-processing

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

我尝试这些代码:


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

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

任何人都可以帮助我?

2 个答案:

答案 0 :(得分:5)

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

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

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

查看更多变体here

答案 1 :(得分:1)

您的图像可能是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); 
}