15

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

    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 を使用した画像処理にまったく慣れていないので、自分の考えを明確にしたいと考えています。私が間違っている場合、画像の各ピクセル値にアクセスするにはどうすればよいですか?

4

2 に答える 2

32

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

 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);

注: これは、mat img が現在ロードされている揮発性メモリ内の画像値のみを変更します。ディスクに保存されている実際の画像「lenna.png」の値を変更するのではなく、mat img の値を変更します (imwrite を実行しない限り)。

ただし、1 チャンネルのグレースケール画像の場合は、CV_32FC1 ではなく CV_8UC1 です。

于 2013-07-29T08:49:25.573 に答える