-1

目的の C で openCV を使用しています。画像を白黒に変換したいのですが、既に行っていますが、出力された白黒画像がはっきりせず、画像に黒い影があります。

誰でも助けることができますか?

- (IBAction)blackAndWhite:(id)sender {

imageView.image=orignalImage;

cv::Mat  dst;

cv::Mat src=[self cvMatFromUIImage:imageView.image];


if( !src.data )
{ cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
}

/// Convert to grayscale
cvtColor( src, src, CV_BGR2GRAY );

/// Apply Histogram Equalization
equalizeHist( src, dst );


imageView.image =[self UIImageFromCVMat:dst];

}

ありがとう

元の画像:

ここに画像の説明を入力

白黒画像 :

ここに画像の説明を入力

4

4 に答える 4

2

まず、画像出力は白黒 (バイナリ) 画像ではありません。グレースケール画像です。

このグレースケール イメージは 256 色 (0 ~ 255) の単一チャネル イメージですが、バイナリ イメージには 0 (黒) または 255 (白) しかありません。

しきい値処理 (cvThreshold) を使用して、グレースケールからバイナリに変換できます。必要なものを達成するのに役立つ多くのバイナリ化アルゴリズムが利用可能です。ローカル 2 値化法は適応性が高く、陰影のある領域の一部を削除するのにも役立ちます。

お役に立てれば。

于 2012-11-05T11:01:46.120 に答える
1

ガンマ補正を調べてください。この場合、画像の線のコントラストに合わせてガンマ値を調整する必要があると思います。ぼやけた画像なので、問題もあると思います。あなたがそれにいる間、あなたはまた、コントラストのいくらかを増やしたいかもしれません。

リンク:

ガンマ補正を理解する

ウィキペディア-ガンマ補正

OpenCVガンマ補正(C ++)

画像のコントラストと明るさの変更-OpenCV

于 2012-11-05T10:20:56.540 に答える
1

ええと、なぜすでに3つの答えがあり、どれも正しくないのかわかりません.

画像をグレースケールに変換した後に画像均等化を適用するのはなぜですか? それなしの出力は次のとおりです。

ここに画像の説明を入力

ここでは、ヒストグラムの均等化について読むことができます。

于 2012-11-05T12:58:42.850 に答える
0

すでに指摘したように、実際には画像を 2 値化していませんが、グレー スケールに変換しています。を使用して二値化できますが、サンプル画像のイルミネーションに強いアーティファクトがあるため、 cv::adaptiveThresholdcv::thresholdを使用してローカルしきい値を決定することをお勧めします。

これは、不均一な照明条件の場合の二値化を説明する便利なリンクです。

C++ でのサンプル プログラム:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cstdlib>

int
main(int argc, char **argv)
{

  cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
  assert(!image.empty());

  cv::Mat binary;
  cv::adaptiveThreshold(image, binary, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 5, 7);

  cv::imshow("Orig", image);
  cv::imshow("Binary", binary);
  cv::waitKey(0);
  cv::imwrite("binary.png", binary);

  return EXIT_SUCCESS;

}

結果: ここに画像の説明を入力

于 2012-11-06T11:02:59.723 に答える