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

猜你喜欢

转载自www.cnblogs.com/dfxdd/p/12298448.html