首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV BGR值修正

OpenCV BGR值修正
EN

Stack Overflow用户
提问于 2016-05-11 14:32:04
回答 3查看 375关注 0票数 0

下面的代码应该将BGR的所有值更改为128。

代码语言:javascript
复制
#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 样本输出图像

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-11 15:06:03

您所看到的行为是因为您没有考虑到BGR图像有3个通道。因此,对于每个像素,实际上需要将3个字节设置为128字节。纠正这种情况的一种方法是将内环修改为以下内容:

代码语言:javascript
复制
for (j = 0; j < (nCol * input_image.channels()); ++j)

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-05-12 15:30:36

如果只更改前35%左右,我会说for循环有问题,这意味着您不能访问后65%。(你的图像有多个通道并不是问题所在,因为只改变其中一个通道只会影响颜色平衡,而不仅仅是给图像的某一部分着色)。但是,确实没有必要逐行对图像重新着色。

Miki在关于使用setTo更改值的评论中的建议是好的。下面是文献资料,以获取更多信息。无论如何,重复代码片段:

代码语言:javascript
复制
input_image.setTo(Scalar(128,128,128))

如果您不想丢失原始图像,因为加载一个图像只是为了使其变成灰色,那么使用类似于以下内容的方法创建一个相同大小的新灰色矩阵(John Wiggles确实有一个道理):

代码语言:javascript
复制
Mat grey(input_image.size(), CV_8UC3, Scalar(128,128,128));

有关声明Mat类型的更多方法,请参见文献资料

票数 0
EN

Stack Overflow用户

发布于 2016-05-11 16:31:21

等等..。您想简单地用128填充/替换所有值吗?为什么要使用原始图像呢?如果我对你的理解是正确的,那么只需这样做:

1.)创建一个与图像大小相同的空Mat图像。

代码语言:javascript
复制
      (Mat Mat_object = Mat(image.rows,image.cols,IMAGE_TYPE) )

2.)将Mat对象的所有值初始化为128。(谷歌是你的朋友)

3.)创建该图像的两个副本(如果您想要这样一个结构的多个层)

代码语言:javascript
复制
               (  Mat_object.clone() helps here  )

4.)创建一个:

代码语言:javascript
复制
         vector<Mat> object, then use object.push_back(image/copy1/copy2)

5.)使用合并(object,final_image)

6.)享受你的空白灰色形象

7.)打印您的空白灰色图像

8.)设置空白的灰色图像

9.)这是一幅空白的灰色图像。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37165782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档