在 OpenCV 中创建随机彩色图像

Posted

技术标签:

【中文标题】在 OpenCV 中创建随机彩色图像【英文标题】:create a random colour image in OpenCV 【发布时间】:2017-08-21 16:15:27 【问题描述】:

我是 OpenCV 的新手。我正在尝试创建一个随机彩色图像。首先,我尝试创建一个随机灰度图像。我附在下面的代码

void random_colour(Mat input_image) 
    for (int i = 0; i < image.rows; i++)
        for (int j = 0; j < image.cols; j++)
            image.at<uchar>(i,j)= rand()%255;
    imwrite("output.tif",image);



int main( int argc, char** argv )

    Mat img=Mat::zeros(100,100,CV_8UC1);
    random_colour(img);
    waitKey(0);
    return 0;

得到的输出是

现在我改变了我上面的代码来创建一个随机的彩色图像。

void random_colour(Mat input_image) 
    for (int i = 0; i < image.rows; i++)
    
        for (int j = 0; j < image.cols; j++)
        
            image.at<Vec3b>(i,j)[0] = rand()%255;
            image.at<Vec3b>(i,j)[1] = rand()%255;
            image.at<Vec3b>(i,j)[2] = rand()%255;
         
    
    imwrite("output.tif",image);

主要功能保持不变。这样做时,我得到一个运行时错误。请帮助我该怎么做。我的理解是色彩空间中的每个像素都有三个分量 RGB。因此,我正在更改每个像素的所有三个组件。我没有得到我想要的输出。

【问题讨论】:

为什么不使用cv::randu?例如cv::randu(image, 0, 256); | “主要功能保持不变。” -- 在这种情况下,您创建一个 1 通道图像,然后尝试访问它,就像它是一个 3 通道图像一样。 您遇到什么错误?请发布错误跟踪,以便我们提供帮助。另外,据我所知,OpenCV 处理 BGR 值而不是 RGB ,请小心。 【参考方案1】:

无需重新发明***,请使用cv::randu()

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;

int main(int argc, char** argv)

    Mat img(100, 100, CV_8UC3);
    randu(img, Scalar(0, 0, 0), Scalar(255, 255, 255));

    imshow("random colors image", img);
    waitKey();

    return 0;

【讨论】:

【参考方案2】:

这条线创建一个灰度图像,它没有三个通道。

 Mat img=Mat::zeros(100,100,CV_8UC1);

这意味着当你使用这条线时,它会崩溃:

 image.at<Vec3b>(i,j)[0] = rand()%255;

您不需要使用 CV_8UC1,因为这会创建 1 个通道 (C1) 尝试使用 CV_8UC3 代替

Mat img=Mat::zeros(100,100,CV_8UC3);

仅供参考 8u 表示 8 位,因此值为 0 到 255,CX 是图像中的通道数。如果你想要 BGR,你需要 C3。

【讨论】:

以上是关于在 OpenCV 中创建随机彩色图像的主要内容,如果未能解决你的问题,请参考以下文章

在opencv中,如何将灰度图像复制并缩放为另一个彩色图像

在opencv中创建透明图像

计算机视觉OpenCV 4高级编程与项目实战(Python版):使用NumPy创建随机雪花点图像

计算机视觉OpenCV 4高级编程与项目实战(Python版):使用NumPy创建随机雪花点图像

在 OpenCV 中创建二维矩阵数组?

在 OpenCV 中将图像转换为彩色铅笔素描