2013-07-29 12 views
9

私は、私の考えでは、cv :: Matのすべての行列要素にアクセスしているということは、実際に画像のすべてのピクセル値にアクセスしていることを意味していますカラー3チャンネルの場合)?次のようにして、CV_32FC1という1つのチャネルイメージがロードされたグレースケールの行列の値を出力するコードを次に示します。これは、cv :: matのメンバーにのみアクセスしていることを意味します。画像のピクセル値(1チャンネル - グレースケールとCV_32FC1タイプ)もありますか?OpenCVのグレースケール画像のピクセル値にアクセスする

cv::Mat img = cv::imread("lenna.png"); 
    for(int j=0;j<img.rows;j++) 
    { 
    for (int i=0;i<img.cols;i++) 
     { 
     std::cout << "Matrix of image loaded is: " << img.at<uchar>(i,j); 
     } 
    } 

私はOpenCVで画像処理をしていて、自分の考えをクリアしたいと思っています。私が間違っていると、画像の各ピクセル値にどのようにアクセスできますか?

+0

cv :: Matの値はピクセル値を表します。だから、あなたは正しい。 – go4sri

答えて

22

あなたはマトリックスの要素にアクセスしており、画像自体にもアクセスしています。あなたのコードでは、これをした後:

cv::Mat img = cv::imread("lenna.png"); 

行列imgはイメージlenna.pngを表します。

は、なぜあなたは、画素値の一部を変更することによって、自分自身を実験していない(それが正常に開かれている場合):

cv::Mat img = cv::imread("lenna.png"); 
//Before changing 
cv::imshow("Before",img); 
//change some pixel value 
for(int j=0;j<img.rows;j++) 
{ 
    for (int i=0;i<img.cols;i++) 
    { 
    if(i== j) 
     img.at<uchar>(j,i) = 255; //white 
    } 
} 
//After changing 
cv::imshow("After",img); 

注:これは唯一の揮発性メモリに画像値を変更し、それがどこマットですimgは現在ロードされています。ディスクに保存されている実際のイメージ "lenna.png"の値を変更しない(imwriteを行わない限り)

ただし、1チャンネルのグレースケールイメージの場合CV_8UC1でないCV_32FC1

+4

は次のようになります: 'img.at (j、i)= 255; //白い(行/列が間違っている) – berak

+0

@Barshan Dasは、あなたが "1チャンネルのグレースケールイメージの場合は、CV_8FC1ではなくCV_8UC1です"という点であなたの要点を詳述できますか?これは何を意味するのでしょうか? – user227666

+0

@berak:aahh Pardon。指してくれてありがとう。編集されました。 – Barshan

3

グレースケールイメージのピクセル値(0〜255の整数)を取得するには、解答も型キャストする必要があります。

int pixelValue = (int)img.at<uchar>(i,j); 
関連する問題