以下代码应该将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,128)。其余图像像素仍包含原始值。我尝试了各种分辨率的各种图片,都产生了相同的结果。
仅编辑了图像的顶部。剩下的仍然是原始图像。分辨率:1280x768 A sample output image
答案 0 :(得分:2)
您所看到的行为是因为您没有考虑到BGR图像有3个频道。因此,对于每个像素,实际上需要将3个字节设置为128.纠正它的一种方法是将内循环修改为以下内容:
for (j = 0; j < (nCol * input_image.channels()); ++j)
希望有所帮助。
答案 1 :(得分:0)
只考虑前35%左右的变化,我会说你的for循环有问题,这意味着你没有访问后者65%。 (此处具有多个通道的图像不是问题,因为仅更改其中一个通道只会影响色彩平衡,而不仅仅会影响图像的某个部分)。但是,实际上不需要逐行重新着色图像。
Miki在使用setTo更改值的注释中的建议是好的。有关详细信息,请参阅the documentation。无论如何重复代码片段:
input_image.setTo(Scalar(128,128,128))
如果您不想丢失原始图像,因为加载图像只是为了使其变灰似乎有点奇怪,使用类似下面的内容制作一个相同大小的新灰色矩阵(John Wiggles确实有一点):
Mat grey(input_image.size(), CV_8UC3, Scalar(128,128,128));
有关声明Mat类型的更多方法,请参阅the documentation。
答案 2 :(得分:-4)
等等......你想用128填充/替换所有值?为什么要使用原始图像?如果我正确地理解你,那么就这样做:
1。)创建一个与图像大小相同的空Mat图像。
(Mat Mat_object = Mat(image.rows,image.cols,IMAGE_TYPE) )
2。)将Mat对象的所有值初始化为128.(Google是你的朋友)
3。)再创建该图像的两个副本(如果你想要多层这样的结构)
( Mat_object.clone() helps here )
4.)创建一个:
vector<Mat> object, then use object.push_back(image/copy1/copy2)
5.使用merge(object,final_image)
6。)享受你的空白灰色图像
7.打印空白灰色图像
8。)构建您的空白灰色图像
9。)这是一张空白的灰色图像
哇