下面的代码应该将BGR的所有值更改为128。
#include<stdio.h>
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
Mat input_image=imread(argv[1],1);
if(!input_image.data)
{
printf("No image data\n");
return -1;
}
long nRow = input_image.rows;
long nCol = input_image.cols;
if(input_image.isContinuous())
{
nCol *= nRow;
nRow = 1;
}
long i,j;
uchar* p;
for(i=0;i<nRow;i++)
{
p=input_image.ptr<uchar>(i);
for(j=0;j<nCol;j++)
{
p[j]=128;
}
}
namedWindow("Changed color",CV_WINDOW_AUTOSIZE);
imshow("Changed color",input_image);
waitKey(0);
return 0;
}图像名作为命令行参数给出。这段代码是使用openCV 3.0编译的。当输入图像被提供时,只有接近35%(上半部分)的图像是灰色的(128,128)。其余的图像像素仍然包含原始值。我尝试了各种不同分辨率的图片,都得到了相同的结果。
只编辑了图片的顶部部分。其余的仍然是原始的image.Resolution:1280x768 样本输出图像。
发布于 2016-05-11 15:06:03
您所看到的行为是因为您没有考虑到BGR图像有3个通道。因此,对于每个像素,实际上需要将3个字节设置为128字节。纠正这种情况的一种方法是将内环修改为以下内容:
for (j = 0; j < (nCol * input_image.channels()); ++j)希望这能有所帮助。
发布于 2016-05-12 15:30:36
如果只更改前35%左右,我会说for循环有问题,这意味着您不能访问后65%。(你的图像有多个通道并不是问题所在,因为只改变其中一个通道只会影响颜色平衡,而不仅仅是给图像的某一部分着色)。但是,确实没有必要逐行对图像重新着色。
Miki在关于使用setTo更改值的评论中的建议是好的。下面是文献资料,以获取更多信息。无论如何,重复代码片段:
input_image.setTo(Scalar(128,128,128))如果您不想丢失原始图像,因为加载一个图像只是为了使其变成灰色,那么使用类似于以下内容的方法创建一个相同大小的新灰色矩阵(John Wiggles确实有一个道理):
Mat grey(input_image.size(), CV_8UC3, Scalar(128,128,128));有关声明Mat类型的更多方法,请参见文献资料。
发布于 2016-05-11 16:31:21
等等..。您想简单地用128填充/替换所有值吗?为什么要使用原始图像呢?如果我对你的理解是正确的,那么只需这样做:
1.)创建一个与图像大小相同的空Mat图像。
(Mat Mat_object = Mat(image.rows,image.cols,IMAGE_TYPE) )2.)将Mat对象的所有值初始化为128。(谷歌是你的朋友)
3.)创建该图像的两个副本(如果您想要这样一个结构的多个层)
( Mat_object.clone() helps here )4.)创建一个:
vector<Mat> object, then use object.push_back(image/copy1/copy2)5.)使用合并(object,final_image)
6.)享受你的空白灰色形象
7.)打印您的空白灰色图像
8.)设置空白的灰色图像
9.)这是一幅空白的灰色图像。
哇
https://stackoverflow.com/questions/37165782
复制相似问题