在OpenCV中创建一个随机的彩色图像

Abh*_*hek 4 c++ opencv computer-vision

我是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;
}
Run Code Online (Sandbox Code Playgroud)

获得的输出是

在此输入图像描述

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

stu*_*men 9

无需重新发明轮子,请使用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;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


GPP*_*PPK 5

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

 Mat img=Mat::zeros(100,100,CV_8UC1);
Run Code Online (Sandbox Code Playgroud)

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

 image.at<Vec3b>(i,j)[0] = rand()%255;
Run Code Online (Sandbox Code Playgroud)

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

Mat img=Mat::zeros(100,100,CV_8UC3);
Run Code Online (Sandbox Code Playgroud)

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