计算机图形学(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访问就可以了,图像的椒盐化,就是给图像上随机打上黑白像素点