2015-10-06 257 views
0

我正在尋找分割彩色圖像以嘗試和識別某些功能。如果它不符合某些決策規則,我正在設置一個像素爲黑色,否則我想讓像素與第一次讀取時完全相同。將OpenCV C++中的彩色圖像中的像素(i,j)設置爲黑色

我讀使用圖像:

Mat apples = imread("C:/Users.......", CV_LOAD_IMAGE_COLOR); 

我嘗試到目前爲止已經爲在第i行第j列設置一個像素爲黑色:

apples.at<uchar>(i,j) = 0; 

其中,當循環在圖像的所有行和列上似乎跳過了圖像的2/3。

我也試過:

Vec3b black; 

black[0] = 0; 
black[1] = 0; 
black[2] = 0; 

apples.at<Vec3b>(i,j) = black; 

這似乎幾乎過濾圖像。任何幫助,將不勝感激!

編輯我循環圖像矩陣過如下:

for(int i=0;i<apples.rows;i++) 
       { 
        for(int j=0;j<apples.cols;j++) 
         { 
          if(applescopy[0].at<uchar>(i,j) == 0 || applescopy[1].at<uchar>(i,j) == 0 || applescopy[2].at<uchar>(i,j) == 0) 
           { 
           apples.at<Vec3b>(i,j) = black; 
           } 
         } 
       } 

如果我消除了「如果」的聲明秒結束,只是設置apples.at UCHAR(我, j)= 0;無條件地,只有圖像的左三分之一會變黑。

編輯2我相信我在原始彩色圖像上使用「分割」似乎修改了原始彩色圖像。我已經做了一個副本,以便在循環中使用,並獲得更多預期的結果,謝謝你們!

+0

請發佈代碼,你說是跳過圖像的2/3rd,所以我們可以幫助你。 – mjuarez

+0

.at (i,j)確實訪問i,j uchar值,如果您有8位灰度圖像,則爲i,j像素,但如果您有彩色圖像,則必須使用3倍的「列」因爲3個uchar值是一個RGB值。最簡單的方法是使用.at (i,j)如果您有3個通道,每個通道8位。 – Micka

回答

2

在特定條件爲真後,將彩色圖像中的像素值指定爲白色。我已將它更改爲白色,您可以通過將255替換爲0來將其設置爲黑色。下面的一段代碼將執行此操作。

#include <opencv\cv.h> 
#include<highgui\highgui.hpp> 
#include <iostream> 
using namespace std; 
using namespace cv; 
int main() { 

Mat originalImage = imread("5.jpg", CV_LOAD_IMAGE_UNCHANGED); 

    if (originalImage.empty()){ 
    cout << "Error : Image cannot be loaded..!!" << endl;   
    return -1; 
    } 

for(int i=0;i<originalImage.rows;i++) 
{ 
    for(int j=0;j<originalImage.cols;j++) 
    { 
    if(originalImage.at<cv::Vec3b>(i,j)[0] == 0 || originalImage.at<cv::Vec3b>(i,j)[1] == 0 || originalImage.at<cv::Vec3b>(i,j)[2] == 0) 
    { 
    //originalImage.at<Vec3b>(i,j) = 255; 
    originalImage.at<cv::Vec3b>(i,j)[0]=255; // change it to white 
    originalImage.at<cv::Vec3b>(i,j)[1]=255; 
    originalImage.at<cv::Vec3b>(i,j)[2]=255; 
     // cout << i<<" " <<j<< endl; 
    } 
    } 
} 
imwrite("result.png",originalImage); 
namedWindow("MyWindow",CV_WINDOW_AUTOSIZE); 
imshow("MyWindow", originalImage); 
waitKey(0); 
destroyWindow("MyWindow"); 
return 0; 
} 

希望這是你需要的!!讓我知道。

1

對於3通道24位圖像,您可以通過uchar訪問,但每列都是單通道值,因此您必須假設通道數爲3倍!或者你只是使用Vec3b訪問像素無處不在:

for(int i=0;i<apples.rows;i++) 
      { 
       for(int j=0;j<apples.cols;j++) 
        { 
        // read whole pixel value, which is a Vec3b for most color images. If you only read uchars you would have to multiply column index by 3 and add the channel number (0..2) 
        cv::Vec3b & pixel = applescopy[0].at<Vec3b>(i,j) 
        // decompose the pixel to three channels 
        uchar & B = pixel[0]; 
        uchar & G = pixel[1]; 
        uchar & R = pixel[2]; 
        // test for any condition, e.g. if one of RGB is 0 
         if(anyCondition) 
          { 
    //set whole Vec3b to some value 
          apples.at<Vec3b>(i,j) = black; 
          } 
        } 
      } 
相關問題