opencv笔记——掩膜操作(图像锐化)

笔记参考自点击这里

1. 获取图像像素指针

  • CV_Assert(myImage.depth() == CV_8U);
  • Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
  • 获得当前行指针const uchar* current= myImage.ptr(row );
  • 获取当前像素点P(row, col)的像素值 p(row, col) =current[col]

2. 像素范围处理saturate_cast

这个函数的功能是确保RGB值得范围在0~255之间,如下所示:

saturate_cast(-100),返回 0。
saturate_cast(288),返回255
saturate_cast(100),返回100

3. 掩膜操作实现图像对比度调整

在这里插入图片描述

  • 矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask 也被称为Kernel)

  • 掩膜矩阵 3*3 在图像矩阵上移动与图像重合,与每一个重合的像素点做掩膜操作,

  • 公式:中心点掩膜后的颜色数据 I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)]I(i,j)

  • 这里是3*3的矩阵,所以图像数据的第一行倒数第一行,第一列倒数第一列不做掩膜操作 。其中: i,j 表示像素的位置,第 i 行,第 j 列, I(i,j) 表示每个通道颜色数据。

  • 掩膜操作不是矩阵乘法,由公式可以看出

  • 该掩膜矩阵的作用: 掩膜操作可以提高图像对比度,对比度提高可以增加图像感官度、锐化,让看起来有点模糊的图像更清晰

4. 函数调用filter2D功能

  • 定义掩膜:Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);一个3*3的掩膜,后面是矩阵数值
  • filter2D( src, dst, src.depth(), kernel ); 其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
    system("color 5E");
    Mat srcimage=imread("C:/Users/xihua/Pictures/Saved Pictures/opencv操作图/luosi.jpg");
    if(!srcimage.data) {
        cout<<"No image!"<<endl; return -1;
    }
    namedWindow("掩膜操作前");
    imshow("掩膜操作前",srcimage);
    Mat dstimage=Mat::zeros(srcimage.size(),srcimage.type());//得到一张与srcimage尺寸相同大小且类型相同的图像,矩阵数值均为0
    int cols=(srcimage.cols-1)*srcimage.channels();//获取列数,不要忘了通道数
    int channels=srcimage.channels();//通道数
    cout<<"channels is:"<<channels<<endl;
    int rows=srcimage.rows-1;//获取行数
    for(int row=1;row<rows;row++) {
        const uchar *previous=srcimage.ptr<uchar>(row-1);//获取图像前一行的指针
        const uchar *current=srcimage.ptr<uchar>(row);//获取图像当前行指针
        const uchar *next=srcimage.ptr<uchar>(row+1);//获取图像下一行指针
        uchar *output=dstimage.ptr<uchar>(row);//获取输出图像的当前行指针
        for(int col=channels;col<cols;col++) {
            output[col]=saturate_cast<uchar>(5*current[col]-(previous[col]+next[col]+current[col-1]+current[col+1]));//套用掩膜公式
        }
    }
    Mat filter2D_image=Mat::zeros(srcimage.size(),srcimage.type());
    Mat mask=(Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//调用API,定义一个3*3的掩膜mask,后为矩阵的数值
    filter2D(srcimage,filter2D_image,srcimage.depth(),mask);//调用filter2D的API
    namedWindow("掩膜操作");//创建一个窗口
    imshow("掩膜操作",dstimage);//把图像显示到对应窗口上
    namedWindow("filter2D");
    imshow("filter2D",filter2D_image);
    waitKey(0);
    return 0;
}


图像效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/105228808