在OpenCV中将RGB转换为黑白
我想知道如何将RGB图像转换成黑白(二进制)图像。
转换后,如何将修改的图像保存到磁盘?
AFAIK,你必须将其转换为灰度,然后将其阈值设为二进制。
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);
使用cv2和Python:
1-灰度图像
import cv2 im_gray = cv2.imread('grayscale_image.png', cv2.CV_LOAD_IMAGE_GRAYSCALE)
2-将图像转换为二进制
(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
3-存储到Disck
cv2.imwrite('bw_image.png', im_bw)
我在其中一个博客post中做了类似的事情。 显示一个简单的C ++示例。
目的是使用开源的cvBlobsLib库来检测打印到微arrays载玻片上的斑点样本,但是为了实现这个目的,图像必须从颜色 – >灰度 – >黑色+白色转换。
“二值化”一个图像的一个简单的方法是比较一个阈值:例如,你可以比较matrix中的所有元素与c ++中的opencv值
cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); cv::Mat bw = img > 128;
这样,matrix中大于128的所有像素现在都是白色,小于128或等于黑色
可选地,对于我来说,给出好的结果是应用模糊
cv::blur( bw, bw, cv::Size(3,3) );
以后你可以像以前说的那样保存它:
cv::imwrite("image_bw.jpg", 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
来获得平滑的黑白图像。