C++ 像素修改不能覆盖整个图像

C++ 像素修改不能覆盖整个图像,c++,ios,opencv,image-processing,pixel,C++,Ios,Opencv,Image Processing,Pixel,我一直在用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 intensi

我一直在用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;
        }
    }
cv::Mat newImg=cv::Mat::zeros(img.size(),img.type());
对于(int y=0;y
这将生成一个新图像,该图像具有如下黑匣子

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

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


谢谢

此问题最常见的原因是您使用错误的元素类型访问图像。使用
.at(y,x)
进行像素访问。这假定映像只有BGR通道。您的图像数据可能是BGRA格式,尤其是因为这是iOS的本机图像格式


要解决此问题,请使用
cv::Vec4b
更改
cv::Vec3b
的所有实例,代码应能正常工作。

此问题最常见的原因是您使用错误的元素类型访问图像。使用
.at(y,x)
进行像素访问。这假定映像只有BGR通道。您的图像数据可能是BGRA格式,尤其是因为这是iOS的本机图像格式


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

我认为出现黑色区域是因为您在循环中切换了行/列。鉴于非黑色区域的高度与宽度相同,很可能出现这种情况。尝试更改x和y。我认为出现黑色区域是因为您在循环中切换了行/列。考虑到非黑色区域的高度与宽度相同,似乎很有可能。尝试更改x和y。可能是alpha通道?480/640=3/4:你似乎发现了一些可怕的事情!问题是:
intensity.val[3]
会包含该像素的Alpha通道数据吗?事实就是如此。问题是,我看到了一些代码,其中使用
img.at
来获取和设置像素数据,是单通道图像吗?是的。
.at()
的类型参数必须与正在访问的
Mat
的数据类型匹配。使用
cv::Vec
访问多通道图像。可能是alpha通道?480/640=3/4:你似乎发现了一些可怕的事情!问题是:
intensity.val[3]
会包含该像素的Alpha通道数据吗?事实就是如此。问题是,我看到了一些代码,其中使用
img.at
来获取和设置像素数据,是单通道图像吗?是的。
.at()
的类型参数必须与正在访问的
Mat
的数据类型匹配。使用
cv::Vec
访问多通道图像。