opencv(2)掩膜操作

1、掩膜操作

掩膜操作是根据掩膜来重新计算每个像素的值

A[i,j]=5*B[i,j]-(B[i-1,j]+B[i+1,j]+B[i,j-1]+B[i,j+1]);

用上述处理的提高对比度

其他的掩膜可参看https://wenku.baidu.com/view/bc1407d6b14e852458fb57cd.html

2、获取图像的指针

const uchar* d = scr.ptr<uchar>(i); //获取scr内第i行的指针。

3、处理越界的像素

saturate_cast<uchar>(-1)=0;
saturate_cast<uchar>(122)=122;
saturate_cast<uchar>(300)=255;

4、直接调用函数

Mat  key = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); //定义掩膜
filter2D(scr, ssr, -1, key); //对scr用key进行掩膜操作存到ssr
//-1表示位图深度按源图像

5、代码

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

using namespace cv;

int main()
{
    Mat scr,dst;
    scr = imread("D:/360.png");
    if (!scr.data)
    {
        printf("找不到图片\n");
        return -1;
    }
    namedWindow("源图像", WINDOW_AUTOSIZE);
    imshow("源图像", scr);

    //dst = scr;
    dst = Mat::zeros(scr.size(), scr.type());
    int cols = (scr.cols - 1)*scr.channels();
    int op = scr.channels();
    int rows = scr.rows;

    for (int i = 1; i < rows - 1; i++)
    {
        const uchar* w = scr.ptr<uchar>(i - 1);
        const uchar* d = scr.ptr<uchar>(i);
        const uchar* s = scr.ptr<uchar>(i + 1);
        uchar* out = dst.ptr<uchar>(i);
        for (int j = op; j < cols; j++)
        {
            out[j] =saturate_cast<uchar>( 5 * d[j] - (w[j] + s[j] + d[j - op] + d[j + op]));
        }
    }

    namedWindow("处理后", WINDOW_AUTOSIZE);
    imshow("处理后", dst);

    Mat ssr, key = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    filter2D(scr, ssr, -1, key);

    namedWindow("处理后api", WINDOW_AUTOSIZE);
    imshow("处理后api", ssr);
    waitKey(0);
    return 0;
}
View Code

6、运行结果

可以看到处理后的图片周围有黑线,因为周围并没有处理赋值。

posted @ 2020-02-07 22:08  gefhg  阅读(377)  评论(0编辑  收藏  举报