web-dev-qa-db-ja.com

OpenCVのグレースケール画像のピクセル値にアクセスする

コンセプトを明確にしたいだけです-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を使用した画像処理は初めてであり、アイデアを明確にしたいです。私が間違っている場合、画像の各ピクセル値にどのようにアクセスできますか?

12
user227666

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

 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が現在ロードされている場所のみを変更します。マットimgの値を変更します。ディスクに保存されている実際の画像「lenna.png」の値は変更しません(imwriteを実行しない場合)

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

27
Barshan Das

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

int pixelValue = (int)img.at<uchar>(i,j);
5
zeerak