Convert RGB to Black & White in OpenCV

前端 未结 5 902
礼貌的吻别
礼貌的吻别 2020-11-28 04:03

I would like to know how to convert an RGB image into a black & white (binary) image.

After conversion, how can I save the modified image to disk?

相关标签:
5条回答
  • 2020-11-28 04:21

    This seemed to have worked for me!

    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);
    
    0 讨论(0)
  • 2020-11-28 04:23

    A simple way of "binarize" an image is to compare to a threshold: For example you can compare all elements in a matrix against a value with opencv in c++

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

    In this way, all pixels in the matrix greater than 128 now are white, and these less than 128 or equals will be black

    Optionally, and for me gave good results is to apply blur

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

    Later you can save it as said before with:

    cv::imwrite("image_bw.jpg", bw);
    
    0 讨论(0)
  • 2020-11-28 04:31

    I do something similar in one of my blog postings. A simple C++ example is shown.

    The aim was to use the open source cvBlobsLib library for the detection of spot samples printed to microarray slides, but the images have to be converted from colour -> grayscale -> black + white as you mentioned, in order to achieve this.

    0 讨论(0)
  • 2020-11-28 04:34

    Simple binary threshold method is sufficient.

    include

    #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;
    }
    

    You can use GaussianBlur to get a smooth black and white image.

    0 讨论(0)
  • 2020-11-28 04:41

    AFAIK, you have to convert it to grayscale and then threshold it to binary.

    1. Read the image as a grayscale image If you're reading the RGB image from disk, then you can directly read it as a grayscale image, like this:

    // 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. Convert an RGB image im_rgb into a grayscale image: Otherwise, you'll have to convert the previously obtained RGB image into a grayscale image

    // 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. Convert to binary You can use adaptive thresholding or fixed-level thresholding to convert your grayscale image to a binary image.

    E.g. in C you can do the following (you can also do the same in C++ with Mat and the corresponding functions):

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

    In the above example, 128 is the threshold.

    4. Save to disk

    // C
    cvSaveImage("image_bw.jpg",img_bw);
    
    // C++
    imwrite("image_bw.jpg", img_bw);
    
    0 讨论(0)
提交回复
热议问题