美文网首页
004-OpenCV笔记-掩膜mask

004-OpenCV笔记-掩膜mask

作者: 赌二八定律 | 来源:发表于2020-02-23 12:08 被阅读0次
OpenCV 掩膜

用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,抠图。
②屏蔽作用,保护局部图片不参与运算。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。

掩膜抠图
#include "opencv2/opencv.hpp"
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;

int main() {

    Mat image, mask;
    Rect r1(100, 100, 300, 300);
    Mat img1, img2, img3, img4;
    image = imread("D:\\test3.jpeg");
    resize(image, image, Size(image.cols / 4, image.rows / 4));//缩小4倍
    mask = Mat::zeros(image.size(), CV_8UC1);//按照原图创建一个全黑的图像
    mask(r1).setTo(255);//对mask图像的操作区域修改为白色
    img1 = image(r1);//将操作区域抠出形成新图片
    image.copyTo(img2, mask);//原图(image)与掩膜(mask)进行与运算后得到了结果图 img2
    //因为白色区域用1表示,原图基本都是有亮度的都是1表示,所以相与之后剩下白色区域的原图图像

    image.copyTo(img3);//把原图赋给了img3
    img3.setTo(0, mask);//显示原图哪个部分,显示mask黑色的区域,黑色用0表示和0相与之后表示应该显示


    imshow("原图", image);//
    imshow("img1", img1);//
    imshow("img2", img2);
    imshow("img3", img3);
    imshow("mask", mask);

    waitKey();

}




获取图像像素的指针

CV_Assert(myImage.depth() == CV_8U);
Mat.ptr<uchar>(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
获得当前行指针const uchar* current= myImage.ptr<uchar>(row );
获取当前像素点P(row, col)的像素值 p(row, col) =current[col]


矩阵的掩膜操作

矩阵的掩膜操作,根据掩膜来重新计算每个像素值,掩膜可以提高图像对比度

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

using namespace cv;

int main(int argc, char** argv) {

    Mat src, dst;
    src = imread("D:\\test4.jpg");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    resize(src, src, Size(src.cols / 4, src.rows / 4));//缩小4倍
    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++) {
    //      int temp = 5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]);
    //      std::cout << temp << std::endl;
    //      output[col] = saturate_cast<uchar>(5 * current[col] - (current[col- offsetx] + current[col+ offsetx] + previous[col] + next[col]));
    //      std::cout << output[col] << std::endl;
    //  }
    //}
    
        //saturate_cast<uchar>()溢出保护,保证数值在0-255之间
    //矩阵掩膜的API操作,替代上面的操作
    Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    filter2D(src, dst, src.depth(), kernel);

    namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
    imshow("contrast image demo", dst);

    waitKey(0);
    return 0;
}
矩阵掩膜操作

相关文章

  • 004-OpenCV笔记-掩膜mask

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

  • Opencv中的掩膜mask

    搞了很久一会儿,终于初步的明白了mask是个什么东东,简单的说,就是一个控制原图哪里需要进行对应改变的标志图,这么...

  • 什么是掩膜(又叫掩码),它的作用是什么

    什么是掩膜(mask) 数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光...

  • OpenCV-Python学习(七):图像的基本运算及mask掩

    目录: 1.图像的基本运算加、减法图像混合按位运算 2.mask掩膜 一、图像的基本运算 加、减法 饱和运算:当运...

  • 掩膜

    通过使用黑白二值图像将对应于黑色部分的原始图像的像素改变为黑色的操作被称为掩膜。 举个例子,比如说要提取蓝色部分,...

  • OpenCV学习之路(四)——矩阵的掩膜操作

    什么是掩膜(mask) 用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过...

  • 图像掩膜

    知识点 unsigned char 整数范围为0到255Mat.ptr (row) --返回row行的首地址,用法...

  • OpenCV:四、图像的基础操作

    前言 在上一章中描述了如何使用自己实现掩膜运算以及调用cv :: filter2D函数对图像进行掩膜运算矩阵的掩膜...

  • QR码设计(5)之mask

    转载请注明出处 1.1掩膜版的种类 QR码的掩膜版一共8种。他是在数据字和纠错字都在矩阵中填充完后,选择掩膜版类型...

  • 三 (3.1 core 模块) 矩阵掩膜与图像线性操作

    一、掩膜操作 1.1掩膜操作函数: 1.1.1filter2D 函数的定义如下: 1.1.2像素范围处理satur...

网友评论

      本文标题:004-OpenCV笔记-掩膜mask

      本文链接:https://www.haomeiwen.com/subject/pvbqqhtx.html