【问题标题】:Pixel modifications does not cover whole image像素修改不覆盖整个图像
【发布时间】:2013-07-13 17:03:43
【问题描述】:

我一直在做一些关于 opencv 和图像处理的工作。每隔一段时间我就会遇到这样的情况,当我尝试像这里一样手动进行一些像素修改时:

cv::Mat newImg = cv::Mat::zeros(img.size(), img.type());

    for( int y = 0; y < img.rows; y++ )
    {
        for( int x = 0; x < img.cols; x++ )
        {
            cv::Vec3b intensity = img.at<cv::Vec3b>(y, x);
            r = intensity.val[0];
            g = intensity.val[1];
            b = intensity.val[2];

            intensity.val[0] = r - (r * modify - r);
            intensity.val[1] = g - (g * modify - g);
            intensity.val[2] = b - (b * modify - b);

            newImg.at<cv::Vec3b>(y, x) = intensity;
        }
    }

这会生成一个新图像,其中包含一个像这样的黑框

现在我只是不明白为什么 for 循环不能覆盖整张照片,我之前设法解决了这个问题,但纯属运气,但仍然不明白这个问题的原因和来源。

简而言之,我的问题是:如何从我的图像中删除这个黑框?

谢谢

【问题讨论】:

  • 我认为黑色区域的发生是因为您在循环中切换了行/列。
  • 看起来很有可能,因为非黑色区域的高度与宽度相同。尝试改变 x 和 y。

标签: c++ ios opencv image-processing pixel


【解决方案1】:

此问题的最常见原因是您使用错误的元素类型访问图像。您使用.at&lt;cv::Vec3b&gt;(y,x) 进行像素访问。这假设图像只有 BGR 通道。您的图像数据可能是 BGRA 格式,尤其是因为这是 iOS 的原生图像格式。

要解决您的问题,请将cv::Vec3b 的所有实例更改为cv::Vec4b,代码应该可以正常工作。

【讨论】:

  • 可能是 Alpha 通道? 480/640 = 3/4:你似乎在做某事
  • 太棒了!这似乎已经成功了,但问题是:可以肯定地说intensity.val[3] 将包含该像素的 Alpha 通道数据吗?
  • 确实如此。
  • 那么,我看到了一些代码,其中使用img.at&lt;uchar&gt; 来获取和设置像素数据,是用于单通道图像吗?
  • 是的。 .at&lt;&gt;() 的类型参数必须与正在访问的Mat 的数据类型相匹配。使用cv::Vec访问多通道图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多