计算机图形学(1)——————图像的掩膜处理

【目的】:图像掩膜的目的很单纯,亮的地方变亮一些,暗的地方变暗一些,公式如下

 

 其实这个公式没什么意思,如果你有好的idea也可以,我们每次定位到中心5的那个地方,乘上5倍,然后减掉周围的像素值,举一个例子,中心是10,上下左右分别是20,30,40,50,你应用公式之后得到的是一个负值,这个时候有一个opencv的函数saturate_cast<uchar>如果你的值是负的他会映射到0,0---255之间保持不变,大于255映射到255,然后他会映射到0,这样那个像素点就变得更暗了,代码实现如下(采用普遍方法):

#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
    Mat image = imread("timg2.jpg");//打开图像的Mat对象
    Mat newimage(image.size(), image.type());
    Mat kern = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//掩膜数组
    int chan = image.channels();//代表图片的通道数,一般灰色图是单通道
    int row = image.rows;//图像矩阵的行数
    int cols = (image.cols - 1) * image.channels();//图像矩阵的列数,假设他是单通道,对于这个时候公式仍然成立
    //所以换成多通道的时候等价于对每一个通道进行操作,一般灰色有一个通道,彩色有三个通道RGB,更甚者还可以
    //加上一个透明颜色的通道
    
    for (int i = 1; i < (row - 1); i++)
    {
        //创建像素指针
        const uchar* prev = image.ptr(i);//中心的部分
        const uchar* prew = image.ptr(i - 1);
        const uchar* pres = image.ptr(i + 1);
        uchar* output = newimage.ptr<uchar>(i);
        for (int j = chan; j < cols; j++)
        {
            output[j] = saturate_cast<uchar>(5*prev[j] - (prev[j - chan] + prev[j + chan] + prew[j] + pres[j]));

        }
    }
    if (!image.data)
    {
        cout << "图片打开失败" << endl;
        return -1;

    }
    Mat array = (Mat_<uchar>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    filter2D(image,newimage,image.depth(),array);
    imwrite("text.jpg", newimage);
    namedWindow("IMAGE", CV_WINDOW_AUTOSIZE);
    imshow("IMAGE", image);
    namedWindow("IMAGE2", CV_WINDOW_AUTOSIZE);
    imshow("IMAGE2", newimage);
    waitKey(0);
    return 0;

}

 处理完图片的结果:

 虽然处理完之后图像更差强人意了,但是对比度提高了不少

猜你喜欢

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