2017-08-21 44 views
3

我是OpenCV的新手。我試圖創建一個隨機的彩色圖像。首先,我試圖創建一個隨機灰度圖像。我已附加以下在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; 
} 

代碼得到的輸出是

enter image description here

現在我改變上面的代碼創建隨機彩色圖像。

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。因此,我正在改變每個像素的所有三個組件。我沒有得到我想要的輸出。

+2

爲什麼不使用['CV :: randu'(http://docs.opencv.org/2.4/modules /core/doc/operations_on_arrays.html#randu)?例如'cv :: randu(image,0,256);'| 「主要功能保持不變。」 - 在這種情況下,您創建一個1通道圖像,然後嘗試訪問它,就好像它是3通道圖像一樣。 –

+1

你得到什麼錯誤?請發佈錯誤追蹤,以便我們提供幫助。另外,就我所知,OpenCV處理'BGR'值而不是'RGB',要小心。 – DarkCygnus

回答

4

這條線創建一個灰度圖像,它沒有三個通道。

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

這意味着,當你使用這條線,它要崩潰:

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

需要,因爲它創建1個通道(C1),不使用CV_8UC1與CV_8UC3代替

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

FYI 8u表示8位,所以值爲0到255,CX是圖像中通道的數量。如果你想要BGR,你需要C3。

+0

謝謝你的工作 – Abhishek

2

無需推倒重來,請使用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; 
} 

enter image description here