在 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 4高级编程与项目实战(Python版):使用NumPy创建随机雪花点图像