我正在使用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)。
答案 0 :(得分:2)
如果您不介意丢失图像的外部1像素粗边,可以将其设置为0,然后“插值”将为您提供所需的内容。
答案 1 :(得分:1)
我不确定Python,但在C / C ++中,您可以指定您希望某个常量用于“未定义”像素。将此常量设置为0,您将解决问题。我确信Python也有类似的东西。