2016-01-21 122 views
-1

Ball如何將低於圖像中的黑色像素更改爲使用OpenCV的庫與C紅色像素++

我想圖像中的黑色像素更改爲紅色像素,使得球應該是白色和紅色。我想使用OpenCV庫並使用C++進行編碼。我曾嘗試將圖像轉換爲RGB。

+0

我將使用http://graphics32.org/wiki/ – 2016-01-21 08:34:35

+4

請顯示你的嘗試。 – Wtower

+2

只是爲了好玩,你可以直接在** ImageMagick **(它安裝在大多數Linux發行版上,可用於OS X和Windows)這樣的命令行編寫代碼,就像這樣......'convert ball .jpg -fuzz 50%-fill red -opaque black result.png' –

回答

4

常見的方法是門檻的形象,所以你的情況,你可能會說的強度低於某一閾值的每個像素將被視爲是黑色,然後重新着色爲紅色。一種方法找到一個很好的閾值(即將圖像的像素分爲兩大類(「更黑」和「更白」)是Otsu閾值:

int main() 
{ 
    cv::Mat input = cv::imread("../inputData/ball_thresholding.jpg"); 

    cv::Mat gray; 
    cv::cvtColor(input,gray,CV_BGR2GRAY); 

    cv::Mat mask; 
    // compute inverse thresholding (dark areas become "active" pixel in the mask) with OTSU thresholding: 
    double grayThres = cv::threshold(gray, mask, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU); 

    // color all masked pixel red: 
    input.setTo(cv::Scalar(0,0,255), mask); 

    // compute median filter to remove the whitish black parts and darker white parts 

    cv::imshow("input", input); 
    cv::waitKey(0); 
    return 0; 
} 

給予這款面膜:

enter image description here

而這一結果:

enter image description here

對於該圖像,即,通過計算OTSU閾值是12 7,這意味着每個灰度像素強度爲127或更小(或小於127,我不確定)將重新着色爲紅色。

如果你想保持遮光效果withing黑/紅色區域,您可以刪除input.setTo(cv::Scalar(0,0,255), mask);林德和替換:

// keep the shading: 
    for(int j=0; j<input.rows; ++j) 
     for(int i=0; i<input.cols; ++i) 
     { 
      if(mask.at<unsigned char>(j,i)) 
      { 
       input.at<cv::Vec3b>(j,i)[2] = 255; 
      } 
     } 

這將導致INT:

enter image description here

1
cv::Mat imBW = imread('bwImg.jpg',CV_LOAD_IMAGE_GRAYSCALE); 
cv::Mat RGB_img = cv::Mat(imBW.rows, imBW.cols, CV_8UC3); 
cv::Mat R_channel = 255-imBW; 
cv::Mat B_channel = cv::Mat::zeros(imBW.rows, imBW.cols, CV_8UC1); 
cv::Mat G_channel = cv::Mat::zeros(imBW.rows, imBW.cols, CV_8UC1); 
vector<cv::Mat> channels; 
channels.push_back(B_channel); 
channels.push_back(G_channel); 
channels.push_back(R_channel); 
cv::merge(channels, RGB_img); 
+0

你試過這個代碼嗎?導致一個圖像,在我的代碼執行嘗試中,先前的黑色變爲白色,而前一個白色變爲黃色。如果你恢復channel.push_back(使得排序是B,G,R),那麼它將是藍色背景的粉紅色球。但我認爲B和G通道具有未初始化的內存值,因此每個程序執行的顏色可能不同。 – Micka

+0

更正BGR序列。我沒有嘗試這個代碼。給出了一個大概的想法。初始化爲零 – nbsrujan

+0

@Micka是的,它的工作。非常感謝你的幫助我 – Rohit

相關問題