无法将图像保存为白色背景 OpenCV 的 JPG

Posted

技术标签:

【中文标题】无法将图像保存为白色背景 OpenCV 的 JPG【英文标题】:Can't save image in JPG with white background OpenCV 【发布时间】:2017-02-12 11:03:12 【问题描述】:

我在 OpenCV 中编写了一个简单的应用程序,删除图像的黑色背景并将其保存为 JPG 中的白色背景。但是,它总是以黑色背景保存。

这是我的代码:

Mat Imgsrc = imread("../temp/temp1.jpg",1) ;
mat dest;
Mat temp, thr;

cvtColor(Imgsrc, temp, COLOR_BGR2GRAY);
threshold(temp,thr, 0, 255, THRESH_BINARY);

Mat rgb[3];
split(Imgsrc,rgb);

Mat rgba[4] =  rgb[0],rgb[1],rgb[2],thr ;
merge(rgba,4,dest);
imwrite("../temp/r5.jpg", dest);

【问题讨论】:

另存为PNG,因为JPEG图像不支持透明度。 谢谢,但我不想要透明我想要白色 请附上示例输入和预期输出 【参考方案1】:

您可以简单地将setTo 与掩码一起使用,以根据掩码将某些像素设置为特定值:

Mat src = imread("../temp/temp1.jpg",1) ;
Mat dst;
Mat gray, thr;

cvtColor(src, gray, COLOR_BGR2GRAY);

// Are you sure to use 0 as threshold value?
threshold(gray, thr, 0, 255, THRESH_BINARY);

// Clone src into dst
dst = src.clone();

// Set to white all pixels that are not zero in the mask
dst.setTo(Scalar(255,255,255) /*white*/, thr);

imwrite("../temp/r5.jpg", dst);

还有几点说明:

    您可以使用以下命令直接将图像加载为灰度:imread(..., IMREAD_GRAYSCALE);

    您可以避免使用所有这些临时的Mats。

    您确定要使用0 作为阈值吗?因为在这种情况下您可以完全避免应用theshold,并将灰度图像中所有为0的像素设置为白色:dst.setTo(Scalar(255,255,255), gray == 0);

我会这样做:

// Load the image 
Mat src = imread("path/to/img", IMREAD_COLOR);

// Convert to grayscale
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY); 

// Set to white all pixels that are 0 in the grayscale image
src.setTo(Scalar(255,255,255), gray == 0)

// Save
imwrite("path/to/other/img", src);

【讨论】:

以上是关于无法将图像保存为白色背景 OpenCV 的 JPG的主要内容,如果未能解决你的问题,请参考以下文章

如何从图像中裁剪或删除白色背景

如何使用OpenCV将白色像素设置为透明

opencv如何将lena.jpg的灰度值读取出来并在计算机上保存下来

在 OpenCV python 中将白色像素转换为黑色

将OpenCV提取的轮廓用在另一张图中去除背景

目标 C:如何在不损失边缘质量的情况下从 JPG 图像中去除白色背景