web-dev-qa-db-ja.com

OpenCVでRGBを白黒に変換する

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

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

64
mohammed

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

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では、次のことができます(C++でMatおよび対応する関数を使用して同じこともできます)。

// 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);
139
Jacob

これは私にとってはうまくいったようです!

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

ブログ投稿 のいずれかで同様のことを行います。簡単なC++の例を示します。

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

1
AndyUK

画像を「バイナリ化」する簡単な方法は、しきい値と比較することです。たとえば、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);
1
alvaropgl

単純なバイナリしきい値方式で十分です。

含める

#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を使用して、滑らかな白黒画像を取得できます。

0