3

我正在不使用 OpenCV 的直接转换功能将拜耳模式去马赛克到 RGB 图像。我使用了双线性插值并让它工作,但我想通过使用弗里曼方法来提高质量。此方法需要中值滤波器。OpenCV 具有可以做到这一点的 medianBlur 函数。但是我在使用这个功能时遇到了麻烦。当我应用 medianBlur 的 cv::Mat 是 CV_8UC1 类型时,它可以工作,但如果它是 CV_32S 类型,那么它就不起作用。这不起作用

    redGreenMedian.create(input.size(), CV_32S);
    blueGreenMedian.create(input.size(), CV_32S);
    blueMinusGreen.create(input.size(), CV_32S);
    redMinusGreen.create(input.size(), CV_32S);
    for(int i = 1; i <= 3; i += 2)
    {
            cv::medianBlur(redMinusGreen, redGreenMedian, i);
            cv::medianBlur(blueMinusGreen, blueGreenMedian, i);
    }

如果我将所有 CV_32S 更改为 CV_8UC1,那么它可以工作。在调试时,我发现它在第二次迭代中崩溃,而不是在第一次迭代中。但是,我需要它在两次迭代中都运行。这在单独编写时也不起作用

    cv::medianBlur(redMinusGreen, redGreenMedian, 3);

顺便说一句,我不必使用 CV_32S,但我需要能够在矩阵中存储负数。
注意:我尝试将矩阵中的所有数字设为正数,然后使用 medianBlur,但它仍然不起作用。
感谢所有帮助。提前致谢。

4

1 回答 1

6

OpenCV 文档似乎很清楚:

src – 输入 1、3 或 4 通道图像;为 3 或 5时ksize,图像深度应为CV_8UCV_16UCV_32F,对于较大的光圈尺寸,只能为CV_8U

由于您需要满足签名值,我认为您最好的选择是使用CV_32F.

此外,文档说

ksize——孔径线性尺寸;它必须是奇数且大于 1,例如:3、5、7

您的循环应用了 1 和 3 的大小(如果我正确阅读了您的代码),其中第一个是无效的,这可能解释了为什么您的第一次迭代不会崩溃(因为它更早地失败了)。

于 2013-06-20T15:20:10.490 回答