我想知道如何将RGB图像转换为黑白(二进制)图像。
转换后,如何将修改后的图像保存到磁盘上?
我想知道如何将RGB图像转换为黑白(二进制)图像。
转换后,如何将修改后的图像保存到磁盘上?
据我所知,您需要将其转换为灰度图像,然后再将其阈值化为二进制。
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);
这对我来说似乎起作用了!
"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);
简单的二值化阈值方法就足够了。
#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
来获取平滑的黑白图像。cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat bw = img > 128;
cv::blur( bw, bw, cv::Size(3,3) );
cv::imwrite("image_bw.jpg", bw);
我在我的博客文章中做了类似的事情。展示了一个简单的C++示例。
目标是使用开源cvBlobsLib库来检测印刷在微阵列玻片上的斑点样本,但是如你所提到的,图像必须从彩色转换为灰度,然后再转换为黑白才能实现这一目标。