【问题标题】:Copy image changing black pixels into white pixels复制图像将黑色像素变为白色像素
【发布时间】:2015-05-05 12:03:57
【问题描述】:

我正在阅读图片(img1=cv2.imread('picture.jpg')),上面只有一个物体,背景是黑色的。

请注意,该对象没有黑色像素。

我想将img1 复制到img2,如下所示:img2=img1.copy() 但我希望在img2 中将img1 的所有黑色像素(背景)设置为白色。我怎样才能达到这个目标?

【问题讨论】:

  • 只是用白色像素填充()?
  • 我会看看我能用@berak 的建议做什么
  • img1 的前景像素呢? img1 是二值图像吗?如果是,那么在img2 上设置img1 背景像素的白色最简单的方法是使用bitwise operators
  • @Kornel 不,它是多色 (RGB) 图像

标签: python python-2.7 opencv numpy


【解决方案1】:

这应该可以:(在 C++ 中,请参阅下面的 cmets)

const cv::Mat img1=cv::imread('picture.jpg')

///Create a grayscale mask -> only pixel !=0 in the mask will be copied
cv::Mat mask(img1.size(),CV_8U); ///cvtColor requires output image to be already allocated
cv::cvtColor(img1, mask, CV_BGR2GRAY);

///Initialize output image to white
cv::Mat img2(img1.size(),CV_8UC3);
img2.setTo(cv::Scalar(255,255,255) );

///Copy pixels from the original image to the destination image, only where mask pixels != 0
img1.copyTo(img2,mask);

使用copyTocvtColor。 唯一的问题是,如果在输入图像中,背景之外的像素为零。在这种情况下,您可能更喜欢 Floodfill 方法,但对于您的问题来说,这可能是一种矫枉过正的做法。

编辑:你也可以使用inRange 来创建你的面具。

【讨论】:

  • 好的,我会试试你的解决方案,稍后通知你(不过我会翻译成 Python)
  • 哦,对不起,我错过了你在 Python 中工作!但这很好,在那种情况下我不会回答 :) :) 找到解决方案后,请随时发布代码。
  • 如果你的解决方案在 C++ 中工作,我会接受它,别担心(我对 C++ 很熟悉,目前我只是投票赞成,因为即使我还没有测试,你的解决方案看起来也很合理)
  • 我还找到了一种算法方法:循环遍历像素,如果像素的三个通道设置为 0(黑色),则将它们设置为 255 :)
猜你喜欢
  • 2018-09-28
  • 2019-12-13
  • 1970-01-01
  • 2015-02-04
  • 2017-07-19
  • 2023-01-13
  • 2015-02-13
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多