2018-10-29 18:45:30 lgyuWT 阅读数 1390

选定的图像,图形或物体,对待处理的图像进行遮挡,来控制图像处理的区域或处理过程。用于覆盖特定图像或物体称为掩模或模板。光学图像处理中,掩模可以做胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。

数字图像处理中,图像掩模主要用于:

  1. 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图想相乘,得到感兴趣图像,感兴趣内图像值保持不变,而区外图像值都为0.
  2. 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数计算,或进队屏蔽区做处理统计。
  3. 结构特征提取,用相似性变量或图像匹配方法检测和图像中与淹没相似的结构特征。
  4. 特殊形状图像的制作。用选定的图像、图形或物体,对待处理的图像进行遮挡,来控制图像处理的区域或处理过程。用于覆盖特定的特定图像或物体称为掩模或模板。

掩模是一种图像滤波的模板,实用掩模经常处理的是遥控图像。当提取道路或者河流,或者房屋时,通过一个n*n的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩模。

2019-07-26 17:00:09 z634863434 阅读数 91

前言

本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961

掩模操作的含义

首先把图像当作一个很大的矩阵,矩阵里的每一行和每一列均有一个数值。然而,我们可以通过对矩阵做处理,使得矩阵的对应的数据发生变化,这个处理过程可以理解为掩模。例如通过掩模操作把矩阵的某一行某一列的值清零,则对应的图像上的该像素点也同时置零。

图像掩模的主要作用如下:

  1. 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;
  2. 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计;
  3. 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征;
  4. 特殊形状图像的制作。

手动掩模

  1. 获取像素指针
Mat.prt<uchar>(row)

作用:获取图像列的指针

输入参数 参数含义
row 图像的列
  1. 获取像素范围
static _Tp cv::saturate_castL<uchar  v>

作用:确保RGB值范围在0~255之间

输入参数 参数含义
v 当前RGB的值
  1. 手动掩模示例
    将图像通过以下矩阵进行掩模
    在这里插入图片描述
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QtDebug>

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Mat dst;
    Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
    if(src.empty()){
        qDebug()<<"can not load image...\n";
        return ;
    }
    namedWindow("test_opencv setup",WINDOW_AUTOSIZE);
    imshow("test_opencv setup",src);
      //一个图像的列数应等于 整个图像的列数乘以这个图像每个像素的通道数
    int clos = (src.cols-1) * src.channels();
      //列的开始像素 
    int offsetx = src.channels();
      //行数
    int rows = src.rows;
      //创建与原图像相同大小的图像且全为0
    dst = Mat::zeros(src.size(),src.type());
    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>(row);
        for (int col = offsetx ; col < clos ; col++){
              //矩阵
              //0 -1 0
              //-1 5 -1
              //0 -1 0
              //掩模算法处理,且将值进行限定保证在0~255之间
            output[col] = saturate_cast<uchar>(5 *current[col] - (current[col-offsetx]+ current[col + offsetx] + previous[col] + next[col]));
        }
    }


    namedWindow("contrast image demo",WINDOW_AUTOSIZE);
    imshow("contrast image demo",dst);
    waitKey(0);
}

原图像
在这里插入图片描述经过掩模后(锐化,提升对比度)
在这里插入图片描述

自动掩模

OpenCV也提供了API函数可以通过简单的调用来完成掩模的操作

void cv::filter2D 	( 
        InputArray  src,
		OutputArray  dst,
		int  ddepth,
		InputArray  kernel,
		Point  anchor = Point(-1,-1),
		double  delta = 0,
		int  borderType = BORDER_DEFAULT 
	) 		

作用:对源图像进行掩模,输出掩模后的图像

输入参数 参数含义
src 原图像
dst 输出图像,大小必须与原图像相同
ddepth 图像的深度 不填写或者-1则原图深度 一致
kernel 内核可理解为需要掩模的矩阵
anchor 内核的基准点,-1-1为中心点
delta 储存目标图像前可选的添加到像素的值 默认为0
borderType 像素向外逼近的方法

使用filter2D 对图像用矩阵进行掩模,矩阵如下:
在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QtDebug>

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Mat dst;
    Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
    if(src.empty()){
        qDebug()<<"can not load image...\n";
        return ;
    }
    namedWindow("test_opencv setup",WINDOW_AUTOSIZE);
    imshow("test_opencv setup",src);

    Mat kernel = (Mat_<char>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
    filter2D(src,dst,src.depth(),kernel);
    qDebug()<<"depth:"<<src.depth();
    namedWindow("contrast image demo",WINDOW_AUTOSIZE);
    imshow("contrast image demo",dst);
    waitKey(0);
}
2017-04-16 21:09:43 LG1259156776 阅读数 5249
掩模运算,又称图像掩模(Image Masking),指用选定的图像、图形或物体,对待处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。
数字图像处理中,图像掩模主要用于:
①提取感兴趣区(ROI,Region Of Interest),用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。
--------------------------------------------------
(ERDAS的话应该是在做遥感影像处理吧)通俗地说掩摸运算的目的就是在对遥感影像进行局部处理前通过模板运算将不参加处理的区域掩盖起来,便于之后对感兴趣区域的处理,同时保证不参加处理的区域的信息不受影响。



2014-06-04 16:31:50 Zhang_13 阅读数 618

用选定的图像、图形或物体,对待处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。

用于覆盖的特定图像或物体称为掩模或模板。

数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。

数字图像处理中,图像掩模主要用于:

①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。

②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

④特殊形状图像的制作。


2018-07-28 16:33:54 qinchao315 阅读数 496

1. 矩阵掩模原理:

矩阵掩模算法feic非常简单,例如将一个3X3的矩阵,一张图像,对图像的每个像素点进行如下操作:

1.分别从左到右,从上到下,每个通道,拿3X3矩阵和原图对应位置做内积,最后得到的值在赋值给zhon中心像素点

简单例子:

通过如下3X3矩阵来做掩模,可以提高图像的对比度

如上图所示,红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象。

 

2.代码实现:

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

using namespace std;
using namespace cv;
int main()
{
    Mat src = imread("E:/4.png");
    Mat dst;
    if (!src.data) {
        cout << "can not load" << endl;
    }
    else {
        cout << "successful" << endl;
    }

    cout << src.cols << endl;
    cout << src.rows << endl;
    cout << src.channels() << endl;

    namedWindow("test1", CV_WINDOW_AUTOSIZE);
    imshow("test1",src);

    //每一列必须乘以通道数,因为有可能为彩色图像,列数为灰度的三倍
    //由于最外围的一圈像素点没办法进行图像掩模,所以减1
    int cols = (src.cols - 1) * src.channels();
    //行为图像的行
    int rows = src.rows;
    int offsetx = src.channels();

    dst = Mat::zeros(src.size(), src.type());
    //row从1开始,rows-1结束,表示不要对最外围的像素点掩模
    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>(row);
        //col从3开始,因为彩色图像会有三个通道,最外围的像素点不掩模
        //每一个像素有BGR三个通道
        //分别对每个像素的BGR都要分别进行掩模操作
        for (int col = offsetx; col < cols; col++) {
            output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
        }
    }

/*
    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 time = (getTickCount() - t) / getTickFrequency();
    cout << "use time " << time << endl;
*/
    namedWindow("test2", CV_WINDOW_AUTOSIZE);
    imshow("test2", dst);


    waitKey(0);

}

3.使用filter2D来实现只需要几行代码就可以搞定上面所有操作

    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 time = (getTickCount() - t) / getTickFrequency();
    cout << "use time " << time << endl;

【OpenCV 】图像掩模

阅读数 2056

图像处理之掩模

阅读数 51

没有更多推荐了,返回首页