新浦京81707con > 注册购买 > Mat基本操作,掩膜操作

原标题:Mat基本操作,掩膜操作

浏览次数:116 时间:2020-04-20

 Mat mask = Mat::zeros(src.size(), CV_8UC1); mask.setTo;

像素范围管理saturate_cast<uchar>

saturate_cast<uchar>(-100),返回0
saturate_cast<uchar>(2888),返回255
低于0再次来到0,大于255重返255 这一个函数确认保障像素值在0到255中间

什么是掩膜(mask)

用选定的图像、图形或物体,对拍卖的图像(全体或部分)举行蒙蔽,来决定图像管理的区域或管理进度。用于覆盖的特定图像或物体称为掩模或模板。光学图像管理中,掩模能够足胶片、滤光片等。
数字图像管理中,掩模为二维矩阵数组,不常也用多值图像。数字图像管理中,图像掩模主要用以:

  • 领取感兴趣区,用事情发生在此以前制作的感兴趣区掩模与待管理图像相乘,获得感兴趣区图像,感兴趣区内图像值保持不改变,而区外图像值都为0。
  • 屏蔽功效,用掩模对图像上一些区域作屏蔽,使其不参加拍卖或不在场拍卖参数的简政放权,或仅对屏蔽区作管理或总结。
  • 结构特征提取,用雷同性变量或图像匹配方法检查评定和提取图像中与掩模相通的布局特征。
  • 优越形状图像的制作。

掩膜是一种图像滤镜的沙盘模拟经营,实用掩膜日常拍卖的是遥感图像。当提取道路恐怕河流,只怕屋子时,通过贰个n*n的矩阵来对图像举办像素过滤,然后将大家需求的地物或许表明优质体现出来。这些矩阵就是一种掩膜。

在OpenCV中,掩模操作是争持简便易行的。大概的意趣是,通过多少个掩模矩阵,重新总括图像中的每一个像素值。掩模矩阵调控了旧图像当前任务以至周边地方像素对新图像当前地点像素值的熏陶力度。用数学术语讲,即大家自定义多个权重表。

大家用肉眼看见的是图像,而计算机却不认知。于是,大家使用数值的花样来记录图像,举例用宝马X5GB值记录图像的各类点,以此来表示图像。犹如上海体育场面,我们来看的是一辆车,而Computer“见到”的是三个蕴涵图像值的矩阵。OpenCV的Mat对象对应的正是矩阵。Mat提供了多数方便人民群众的API来创制、操作矩阵。

获得图像像素指针

CV_Assert(myImage.depth()==CV_8U)
Mat.ptr<uchar>(int i=0卡塔尔国获取像素矩阵的指针,索引i代表第几行,从0最初计数
获得当前行指针const uchar* current = myImage.ptr<uchar>(row);
获取当前像素点P(row,colState of Qatar的像素值p(row,col卡塔尔(قطر‎ = current[col]

掩膜操作实现图像相比度调解

矩阵的掩膜操作极度简约,依据掩膜来重新总计各个像素的像素值,掩膜(mask卡塔尔国也被称作 kernel。
由此掩膜操作完结图像比较度提升。
I(i,j) = 5*I(i,j) - [I(i-1,j) I(i 1,j) I(i,j-1) I(i,j 1)]

Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,
                               -1,  5, -1,
                                0, -1,  0);

丙辰革命是主导像素,从上到下,从左到右对每一种像素做相符的拍卖操作,获得最后结果正是相比较度进步以后的出口图像Mat对象。

图片 1

kernel.png

第贰个参数是rows,该矩阵的行数;第三个参数是cols,该矩阵的列数;第四个参数是该矩阵成分的体系。那句话代表成立二个轻重为240×320的矩阵,里面包车型客车因素为8位unsigned型,通道数有3个。

矩阵掩膜操作(相比度升高,立体感巩固State of Qatar

数字图像管理中,掩模为二维矩阵数组,有时也用多值图像。数字图像管理中,图像掩模重要用以:

  • 领取感兴趣区,用事情未发生前制作的感兴趣区掩模与待管理图像相乘,取得感兴趣区图像,感兴趣区内图像值保持不改变,而区外图像值都为0。
  • 屏蔽功效,用掩模对图像上某个区域作屏蔽,使其不到位拍卖或不参与拍卖参数的忖度,或仅对屏蔽区作管理或总结。
  • 构造特征提取,用相近性别变化量或图像相配方法检验和提取图像中与掩模相通的布局特征。
  • 独特形状图像的创设。

掩膜操作实现图像相比度调治,依照掩膜来再次总结各样像素的像素值,掩膜(mask卡塔尔国也被叫做 kernel。
经过掩膜操作完结图像相比度升高。

图片 2

mask.png

上边矩阵像素操作能够用上面公式来代表
I(i,j) = 5*I(i,j) - [I(i-1,j) I(i 1,j) I(i,j-1) I(i,j 1)]

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

using namespace cv;

int main(int argc, const char * argv[]) {
    Mat src, dst;
    //加载图像
    src = imread("F:/build_android.jpg");

    if (!src.data) {
        printf("could not load imagen");
        return -1;
    }
    //显示
    namedWindow("input Image", CV_WINDOW_AUTOSIZE);
    imshow("input Image", src);

     //掩膜操作
     int cols = (src.cols-1) * src.channels();//图像宽度等于图像的cols乘以图像的通道数
     int offsetx = src.channels();
     int rows = src.rows;//图像高度等于图像的rows
     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 < cols; col  ) {
         output[col] = saturate_cast<uchar>(5*current[col] - (current[col-offsetx]   current[col offsetx]   previous[col]   next[col]));
       }
     }

    //显示
    namedWindow("contrast Image", CV_WINDOW_AUTOSIZE);
    imshow("contrast Image", dst);

    waitKey(0);
    return 0;
}

那么每一回管理图片大家都亟需把地点一长串代码拷贝到工程里面去呢,上述代码太多,其实opencv已经完结了地点功用。
filter2D函数能够实现地点效果,在第4个参数增添掩膜矩阵就足以兑现均等效果

//定义掩膜
Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,
                               -1,  5, -1,
                                0, -1,  0);

上面代码能够用下边代码代替

double t = getTickCount();  //获得当前时间
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1 ,0);
//src.depth() 表示与原图深度一样,-1也表示一样
filter2D(src, dst, src.depth(), kernel);
double time = (getTickCount() - t) / getTickFrequency();
printf("time consume %.5f", time);
namedWindow("contrast Image", CV_WINDOW_AUTOSIZE);
imshow("contrast Image", dst);

示范代码

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

using namespace cv;

int main(int argc, const char * argv[]) {
    Mat src, dst;
    //加载图像
    src = imread("/Users/Longxia/Downloads/552566-XXL.jpg");

    if (!src.data) {
        printf("could not load imagen");
        return -1;
    }
    //显示
    namedWindow("input Image", CV_WINDOW_AUTOSIZE);
    imshow("input Image", src);

    /*
     //掩膜操作
     int cols = (src.cols-1) * src.channels();
     int offsetx = src.channels();
     int rows = src.rows;
     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 < cols; col  ) {
         output[col] = saturate_cast<uchar>(5*current[col] - (current[col-offsetx]   current[col offsetx]   previous[col]   next[col]));
       }
     }
     */

    // openCV API 掩膜操作
    //定义一个掩膜
    double t = getTickCount();  //获得当前时间
    Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1 ,0);
    //src.depth() 表示与原图深度一样,-1也表示一样
    filter2D(src, dst, src.depth(), kernel);
    double time = (getTickCount() - t) / getTickFrequency();
    printf("time consume %.5f", time);
    //显示
    namedWindow("contrast Image", CV_WINDOW_AUTOSIZE);
    imshow("contrast Image", dst);

    waitKey(0);
    return 0;
}
uchar* ptr = image.ptr;

矩阵基本操作

opencv最主题的构造体是Mat,opencv提供了一种种Mat基本操作
加载图片cv::imgread
改良图片(色彩变化卡塔尔cv::cvtColor 第多少个参数表示从源色彩空间改变成指标色彩空间
保留图片cv::imgwrite
来得图像cv::namedWindows cv::imshow

#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat src = imread("F:/build_android.png",IMREAD_GRAYSCALE);
    Mat output_img = Mat::zeros(src.size(),src.type());
    namedWindow("test opencv", CV_WINDOW_AUTOSIZE);//CV_WINDOW_AUTOSIZE不允许任务修改窗口大小
    imshow("show img", src);

    namedWindow("test opencv2", CV_WINDOW_AUTOSIZE);

    cvtColor(src, output_img, COLOR_BGR2HLS);
    imshow("show img2", output_img);

    int cols = src.cols*src.channels();//图像宽度等于图像的cols乘以图像的通道数
    int rows = src.rows;//图像高度等于图像的rows
    for (int row = 1; row < rows-1; row  ) {

    }
    //imwrite("F:/hlstest.png",output_img);
    waitKey(0);
    return 0;
}

像素范围管理saturate_cast<typename _Tp>()

  • saturate_cast<uchar>(-100),返回0
  • saturate_cast<uchar>(288),返回255
  • saturate_cast<uchar>(100),返回100

这么些函数的功效是保障EscortGB值范围在0~255之间。

图片 3mask.png

函数调用filter2D功用

filter2D 函数的概念如下:

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

当中src与dst是Mat类型变量、ddepth表示位图深度,有32、24、8等。

世家会意识那样做掩膜操作也太艰巨了。那时候我们就找OpenCV来帮个忙,看看它是怎么落到实处的。

  • 图像的内部存款和储蓄器分配和假释由Mat类自动管理

  • Mat类由两有的数据整合:矩阵头(包括矩阵尺寸、存款和储蓄方法、存款和储蓄地点等卡塔尔(قطر‎和七个针对存储全体像素值的矩阵(依照所选存储方法的两样,矩阵能够是例外的维数卡塔尔国的指针。Mat在开展赋值和拷贝时,只复制矩阵头,而不复制矩阵,进步效能。要是矩阵归于多少个Mat对象,则透过援用计数来剖断,当倒数使用它的对象,则承受释放矩阵。

  • 能够运用clone和copyTo函数,不止复制矩阵头还复制矩阵。

图片 4kernel

本条拷贝的动作完整版本是那样的:

图片 5demo1图片 6demo2

实际那个公式正是5倍的中坚像素减去周边的多少个像素之和。大家举四个例证来看下那一个公式的结果。

切实的代码如下:

图片 7kernel

因为咱们地方取得的mask中,感兴趣的区域是青白的,表明感兴趣区域的像素都以非0,而非感兴趣区域都以水草绿,评释这几个区域的像素都以0。一旦原图与mask图进行与运算后,得到的结果图只留下原始图感兴趣区域的图像了。也正剩下铠的头顶了。

 Mat src; UIImageToMat(image, src); Mat dst; Mat kernel = (Mat_<char> << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(src, dst, src.depth(), kernel);

指南针操作,表示取得image第row行的指针

先是步创立与原图同样大小的mask图像,并将具有像素开始化为0,因而全图成了一张全水晶色图。第二步将mask图中的r区域的具有像素值设置为255,也正是全体r区域改为了藏青。

小编们能够大致看看要是核心点的值超越周围,则总结后的结果会将中央点与周边的值差异拉得更加大;假诺中央点的值小于周围,则统计后的结果也会将核心点与左近的值差异拉大。那样“大的大,小的小”结果不正是对待分明了吗,也正是进步了相比度。

图片 8mask图片

矩阵的掩膜操作正是基于掩膜来再一次计算每种像素的像素值,掩膜也被誉为kernel。通过掩膜操作达成图像相比较度提升的公式如下。

本文由新浦京81707con发布于注册购买,转载请注明出处:Mat基本操作,掩膜操作

关键词: 新浦京81707con 操作 掩膜 Learning opencv

上一篇:新萄京娱乐场x606com手工搭建环境,Swift已有项目

下一篇:没有了