opencv掩膜操作

Posted abc1604831024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv掩膜操作相关的知识,希望对你有一定的参考价值。

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("找不到图片
");
        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、运行结果

技术图片技术图片技术图片

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

以上是关于opencv掩膜操作的主要内容,如果未能解决你的问题,请参考以下文章

opencv掩膜操作

OpenCV 计算机视觉掩膜操作

opencv4opencv视频教程 C++(opencv教程)3矩阵的掩膜操作(filter2D)

opencv学习笔记-掩膜操作-调用filter2D功能

OpenCV探索之路(十三):详解掩膜mask

OpenCV-灰度图蒙版GrayMask