[OpenCV] 03-矩阵的掩膜操作

03-矩阵的掩膜操作
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现:

//利用掩膜计算提高图像对比度
#include<iostream>
#include<opencv2/opencv.hpp>
#include<math.h>

using namespace std;
using namespace cv;

int main(int argc,char** argv)
{
    Mat
    myImage, outputImage;
    myImage = imread("222.jpg", 1);
    if (!myImage.data)
    {
        cout << "coun't load this image..." << endl;
        return -1;
    }
    namedWindow("input", WINDOW_NORMAL);
    imshow("input", myImage);
    outputImage = Mat(myImage.size(), myImage.type()); //outputImage初始化,使其尺寸和类型与myImage一样   
    //myImage.copyTo(outputImage);                       //复制图片
    int nchannels = myImage.channels();   //图片通道
    int height = myImage.rows;            //矩阵行数
    int width = myImage.cols;             //列数

    //掩膜(MASK)计算
    for (int row = 1; row < height - 1; row++)
    {
    	 //用指针获取图像像素
    	 const uchar* previous = myImage.ptr<uchar>(row - 1);
   	 const uchar* courrent = myImage.ptr<uchar>(row);
   	 const uchar* next = myImage.ptr<uchar>(row + 1);
   	 uchar* output = outputImage.ptr<uchar>(row);
   	 for (int col = nchannels; col < nchannels*(myImage.cols - 1); col++) //注意乘以通道数
    	 {
       	     *output =saturate_cast<uchar>( 5 * courrent[col] - previous[col] -         next[col] -courrent[col - nchannels] - courrent[col + nchannels]);
       	     //saturate_cast<uchar>() 调整像素值,>255返回0,<0返回
       	     output++;
          }
    }
    //上面的计算等价于
    //Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);      //定义掩膜
    //filter2D(myImage, outputImage, myImage.depth(), kernel);
    namedWindow("output", WINDOW_NORMAL);
    imshow("output", outputImage);
    waitKey(0);  //无限等待
    return 0;
}

没加saturate_cast() 调整像素值时图片如下:存在超限点

在这里插入图片描述
备注:以上内容转载笔者早期OneNote笔记,较多为图片格式,比较简陋。
后记:笔者才疏学浅,如有错误,望指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值