OpenCV BGR值修改

时间:2016-05-11 14:32:04

标签: c++ opencv

以下代码应该将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

3 个答案:

答案 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。)这是一张空白的灰色图像