004-OpenCV笔记-掩膜mask

2020-02-23  本文已影响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;
}
矩阵掩膜操作
上一篇下一篇

猜你喜欢

热点阅读