計算機圖形學(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;

}

 

 處理完圖片的結果:

 

 雖然處理完之后圖像更差強人意了,但是對比度提高了不少


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM