C++ 像素修改不能覆盖整个图像
我一直在用opencv和图像处理做一些工作。偶尔我会遇到这样的情况,当我尝试手动进行一些像素修改时,如下图所示: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
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
访问多通道图像。