66

RGB 画像を白黒 (バイナリ) 画像に変換する方法を知りたいです。

変換後、変更した画像をディスクに保存するにはどうすればよいですか?

4

5 に答える 5

144

私の知る限り、それをグレースケールに変換してから、バイナリにしきい値を設定する必要があります。

1. イメージをグレースケール イメージとして 読み取る ディスクから RGB イメージを読み取る場合は、次のようにグレースケール イメージとして直接読み取ることができます。

// C
IplImage* im_gray = cvLoadImage("image.jpg",CV_LOAD_IMAGE_GRAYSCALE);

// C++ (OpenCV 2.0)
Mat im_gray = imread("image.jpg",CV_LOAD_IMAGE_GRAYSCALE);

2. RGB 画像im_rgbをグレースケール画像に変換します。それ以外の場合は、以前に取得した RGB 画像をグレースケール画像に変換する必要があります。

// C
IplImage *im_rgb  = cvLoadImage("image.jpg");
IplImage *im_gray = cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);
cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);

// C++
Mat im_rgb  = imread("image.jpg");
Mat im_gray;
cvtColor(im_rgb,im_gray,CV_RGB2GRAY);

3. バイナリへの変換適応しきい値処理または固定レベルしきい値処理を使用して、グレースケール イメージをバイナリ イメージに変換 できます。

たとえば、C では次のことができます (Mat と対応する関数を使用して C++ でも同じことができます)。

// C
IplImage* im_bw = cvCreateImage(cvGetSize(im_gray),IPL_DEPTH_8U,1);
cvThreshold(im_gray, im_bw, 128, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

// C++
Mat img_bw = im_gray > 128;

上記の例では、128 がしきい値です。

4. ディスクに保存

// C
cvSaveImage("image_bw.jpg",img_bw);

// C++
imwrite("image_bw.jpg", img_bw);
于 2009-10-18T23:42:57.453 に答える
3

これは私のために働いたようです!

Mat a_image = imread(argv[1]);

cvtColor(a_image, a_image, CV_BGR2GRAY);
GaussianBlur(a_image, a_image, Size(7,7), 1.5, 1.5);
threshold(a_image, a_image, 100, 255, CV_THRESH_BINARY);
于 2015-10-06T08:28:41.800 に答える
1

単純な 2 値しきい値法で十分です。

含む

#include <string>
#include "opencv/highgui.h"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

int main()
{
    Mat img = imread("./img.jpg",0);//loading gray scale image
    threshold(img, img, 128, 255, CV_THRESH_BINARY);//threshold binary, you can change threshold 128 to your convenient threshold
    imwrite("./black-white.jpg",img);
    return 0;
}

GaussianBlur滑らかな白黒画像を得るために使用できます。

于 2016-10-21T13:05:32.177 に答える
1

私は自分のブログ投稿の 1 つで似たようなことをしています。簡単な C++ の例を示します。

目的は、オープン ソースのcvBlobsLibライブラリを使用して、マイクロ アレイ スライドに印刷されたスポット サンプルを検出することでしたが、これを達成するには、前述のように画像をカラー -> グレースケール -> 黒 + 白に変換する必要があります。

于 2011-08-13T15:37:51.797 に答える
1

画像を「二値化」する簡単な方法は、しきい値と比較することです。たとえば、行列内のすべての要素を c++ の opencv を使用して値と比較できます。

cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
cv::Mat bw = img > 128;

このようにして、マトリックス内の 128 より大きいピクセルはすべて白になり、128 未満または等しいピクセルは黒になります。

オプションで、私にとって良い結果が得られたのは、ぼかしを適用することです

cv::blur( bw, bw, cv::Size(3,3) );

後で、前に述べたように次のように保存できます。

cv::imwrite("image_bw.jpg", bw);
于 2014-05-05T21:57:57.103 に答える