OpenCV零填充

时间:2011-03-15 12:29:00

标签: python image-processing opencv

我正在使用cvFilter2D来过滤图片。其documentation说:

  

当光圈部分在外面时   图像,函数插值   距离最近的异常像素值   图像内部的像素。

虽然这种推断在大多数情况下都很好,但我想通过零填充来处理这种异常像素值(这里是这意味着1D example)。

以下是我目前的做法:

def do_filter(im, filt):
    N, M = cv.GetSize(filt)
    _, _, width, height = cv.GetImageROI(im)
    padded = cv.CreateImage((width + N, height + M), im.depth, im.nChannels)
    cv.SetZero(padded)
    roi = (N/2, M/2, width, height)
    cv.SetImageROI(padded, roi)
    cv.Copy(im, padded)
    cv.ResetImageROI(padded)
    cv.Filter2D(padded, padded, filt)
    result = cv.CreateImage(cv.GetSize(im), im.depth, im.nChannels)
    cv.SetImageROI(padded, roi)
    cv.Copy(padded, result)
    return result

基本上:

  • 从输入
  • 创建填充图像和复制内容
  • 过滤
  • 修剪填充区域

我不喜欢这个,因为我必须做很多繁忙的工作才能移动像素。这很慢。

过滤时有没有更好的方法来进行零填充?

修改

我发现cvCopyMakeBorder稍微清晰一点,但仍会复制图像,因此很慢。

编辑2

C ++ API中的

cv::filter2D执行此操作。我想知道旧的C API是否具有相同的功能(我无法从Python访问C ++ API,但我可以从Python访问C API)。

2 个答案:

答案 0 :(得分:2)

如果您不介意丢失图像的外部1像素粗边,可以将其设置为0,然后“插值”将为您提供所需的内容。

答案 1 :(得分:1)

我不确定Python,但在C / C ++中,您可以指定您希望某个常量用于“未定义”像素。将此常量设置为0,您将解决问题。我确信Python也有类似的东西。