计算机图形学(2)
【Define】图像的二值化就是在一定范围内突出图像的一些信息,让不太黑的或者不太白的变得更白(对于单通道而言),其他通道也可以根据这样的不同进行实现
其中A和B是像素的取值范围,当然,这个分段函数的R(T)也是可以进行改变的,下面看看两种代码的实现:
【c++】:
#include<iostream> using namespace std; #include<opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("picture4.jpg", 0); //cout << image << endl; //实现二值化 Mat out1 = image.clone(); Mat out=image.clone(); for (int i = 0; i < image.rows; i++) { const uchar* pimage = image.ptr(i); uchar* pout = out.ptr(i); for (int j = 0; j < image.cols; j++) { if (pimage[j] >= 100 && pimage[j] <= 255) { pout[j] = (uchar)255;//0 } else { pout[j] = (uchar)0;//黑色 } } } threshold(image, out1, 100, 255, 0); imshow("原图", image); imshow("处理", out); imshow("系统自带", out1); waitKey(0); return 0; }
处理结果如上,看看这个threshold的函数,第一个参数是输入图像的矩阵,第二个参数是输出图像的矩阵,第三个和第四个就是A和B的范围,并且最后一个是系统的计算方法;
【Matlab】版本的:
image=imread(‘C:\Users\Administrator\Desktop\图片\picture3.jpg‘); image2=rgb2gray(image); image3=image2; for i=1:1200 for j=1:1920 if(image2(i,j)>=100&image2(i,j)) image3(i,j)=255; else image3(i,j)=0; end end end figure,imshow(image3) figure,imshow(image2)
处理结果如上所示,可以看到和c++的处理是几乎一样的,个人觉得不应该按照黑白的取值,至于你想突出什么样的色素用split进行分割然后合并就行了。
【其余的一些笔记】:
//图像的添加椒盐噪声和中值滤波器的处理噪声(直接贴代码,不做讨论)
#include<iostream> using namespace std; #include<opencv2/opencv.hpp> using namespace cv; //椒盐噪声 Mat addSaltNoise(Mat& image2, int n) { Mat image1 = image2.clone(); for (int k = 0; k < n; k++) { int i = rand() % image1.rows; int j = rand() % image1.cols; if (image1.channels() == 1) { image1.at<uchar>(i, j) = 0; } else { image1.at<Vec3b>(i, j)[0] = 0; image1.at<Vec3b>(i, j)[1] = 0; image1.at<Vec3b>(i, j)[2] = 0; } } for (int l = 0; l < n; l++) { int i = rand() % image1.rows; int j = rand() % image1.cols; if (image1.channels() == 1) { image1.at<uchar>(i, j) = 255; } else { image1.at<Vec3b>(i, j)[0] = 255; image1.at<Vec3b>(i, j)[1] = 255; image1.at<Vec3b>(i, j)[2] = 255; } } return image1; } int main() { Mat image = imread("picture5.jpg"); imshow("原图", image); Mat out = addSaltNoise(image, 10000); imshow("图像椒盐化", out); medianBlur(out, out, 3); imshow("滤波器", out); waitKey(0); return 0; }
运行结果如下:
上面采用的中值滤波器是opencv自带的,自己实现也很简单,采用Vec3b的类型然后对图像进行at访问就可以了,图像的椒盐化,就是给图像上随机打上黑白像素点