【问题标题】:OpenCV filter2D inside non rectangular ROI非矩形 ROI 内的 OpenCV filter2D
【发布时间】:2016-05-27 19:45:17
【问题描述】:

我有一张图片,其中只有一个小的非矩形部分有用。我有一个表示有用 ROI 的二进制掩码。

如何将 OpenCV 中的 cv::filter2D 仅应用于由二进制掩码定义的 ROI?


编辑

我的 ROI 外像素的值为 0。另一个像素的浮点值约为 300-500,因此 ROI 边界中 filter2D 的问题具有高值转换。

也可以将 ROI 外的像素值设置为 ROI 内最近的像素,类似于cv::BORDER_REPLICATE

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    可能是这样的。我认为边界掩码附近没有问题

    #include "opencv2/opencv.hpp"
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    
    int main(int argc, char* argv[])
    {
    Mat m = imread("f:/lib/opencv/samples/data/lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    
    Mat mask=Mat::zeros(m.size(), CV_8UC1),maskBlur,mc;
    // mask is a disk
    circle(mask, Point(200, 200), 100, Scalar(255),-1);
    
    Mat negMask;
    // neg mask
    bitwise_not(mask, negMask);
    circle(mask, Point(200, 200), 100, Scalar(255), -1);
    Mat md,mdBlur,mdint;
    
    m.copyTo(md);
    
    // All pixels outside mask set to 0
    md.setTo(0, negMask);
    imshow("mask image", md);
    // Convert image to int
    md.convertTo(mdint, CV_32S);
    Size fxy(13, 13);
    blur(mdint, mdBlur, fxy);
    mdBlur.convertTo(mc, CV_8U);
    imshow("Blur without mask", mc);
    imwrite("blurwithoutmask.jpg",mc);
    mask.convertTo(maskBlur, CV_32S);
    // blur mask
    blur(maskBlur, maskBlur, fxy);
    Mat mskB;
    mskB.setTo(1, negMask);
    divide(mdBlur,maskBlur/255,mdBlur);
    
    mdBlur.convertTo(mc, CV_8U);
    imshow("Blur with mask", mc);
    imwrite("blurwithmask.jpg",mc);
    waitKey();
    
    }
    

    【讨论】:

    • 谢谢 :) 抱歉,我不明白这是做什么用的或者它有什么用处?
    • 可能是我不明白你的问题。在之前的程序中,我将 filter2d 应用于所有图像(将掩码外的所有像素设置为 0),并在将结果校正为忽略设置为 0 的像素之后。此校正是使用权重完成的。在您可以将结果复制到原始图像中后
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多