OpenCV2---矩阵的掩膜操作

二、矩阵的掩膜操作(提高图像的对比度)
1、获取图像像素指针
Mat.ptr<uchar>(int i = 0)//ptr为指针,uchar为指针类型获取像素矩阵的指针,索引i代表第几行,从0开始计算行数。
const uchar* current = Mat.ptr<uchar>(row);获取当前行指针
p(row, col) = current[col]获取当前像素点P(row,col)的像素值
2、像素范围处理saturate_cast < uchar >
这个函数的功能是确保RGB值在范围0-255之间。
saturate_cast<uchar>(-100)返回0
saturate_cast<uchar>(288)返回255
saturate_cast<uchar>(100)返回100
3、掩膜操作
通过掩膜操作,可以提高图像的对比度。根据掩膜可以重新计算每个像素的像素值。需提供一个卷积模板,遍历图像各个像素值,让每一个像素值与模板卷积赋值为新的像素值。例如下面即为一种类型的卷积模板:
I(i , j) = 5 * I(i , j) - [I(i - 1 , j) + I(i + 1 , j) + I(i , j - 1) + I(i , j + 1)]
[ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] \begin{bmatrix} 0&-1&0\\ -1&5&-1\\ 0&-1&0 \end{bmatrix} 010151010
4、函数调用filter功能
Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);定义掩膜
filter2D(src, dst, src.depth(),kernel);其中src与dst是Mat类型变量,src.depth表示位图深度(也可以用-1代替)。
5、初始化一幅图像
dst = Mat::zeros(src.size(), src.type());
初始化dst图片,初始化dst图片的大小、类型均和src图像一致,初始化为0,即一张全黑图(都是0,都是255就是白色,只有某一单通道,就是单色)
6、获取程序运行时间

double t = getTickCount();//在测试程序前记录一下当前运行时间
double timeconsume = (getTickCount() - t) / getTickFrequency();//测试程序后,计算时间差值即为测试程序运行时间
printf("time consume %.2f", timeconsume);

示例代码(掩膜操作,提高图像对比度):

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    Mat src, dst;
    src = imread("C:/Users/26839/Pictures/测试.png");
    if(!src.data) {
        printf("could not load...\n");
        return -1;
    }
    imshow("input", src);
    
    /*int cols = (src.cols - 1) * src.channels();//多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图
    int offsetx = src.channels();//获取图像的通道数
    int rows = src.rows;//获取图片行方向像素值
    
    dst = Mat::zeros(src.size(),src.type());//初始化dst图片,初始化dst图片的大小、类型均和src图像一致,初始化为0,即一张全黑图(都是0,都是255就是白色,只有某一单通道,就是单色)
    for (int row = 1; row < (rows - 1); row++) {//行遍历,不能遍历第一行和最后一行
        const uchar* previous = src.ptr<uchar>(row - 1);//获得当前行上一行的指针
        const uchar* current = src.ptr<uchar>(row);//获得当前行指针
        const uchar* next = src.ptr<uchar>(row + 1);//获得当前行下一行的指针
        uchar* output = dst.ptr<uchar>(pow);//用output存放指向des每一行的指针
        for (int col = offsetx; col < cols; col++) {//由于定义时col已经-1,这里只需小于cols即可,可以保证不遍历到最后一列,应从offset开始,道理和前面一样,第一列前面已经不存在和其相同通道类型的像素,无法参与计算
            output[col] = saturate_cast<uchar>(5* current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));//掩膜运算,只能是同种通道类型的像素能相互计算,所以这里列方向加减offsetx
        }
    }掩膜基本操作方法,下面直接调用函数实现*/

    double t = getTickCount();
    Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//定义掩膜
    filter2D(src, dst, src.depth(), kernel);//掩膜操作
    double timeconsume = (getTickCount() - t) / getTickFrequency();//测试程序后,计算时间差值即为测试程序运行时间
    printf("time consume %.2f", timeconsume);

    imshow("contrast image demo", dst);
    waitKey(0);
    destroyAllWindow();
    return 0;
}

输出运行结果如下所示:
原始图像
在这里插入图片描述
掩膜操作处理后的图像
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值