我有一个灰度图像和一个二值掩码的ROI在该图像。我想在灰度图像上执行模糊操作,但只在面具的范围内。现在,我正在模糊整个图像,不只是删除遮罩外的项目,但我不希望像素以外的掩码影响我的投资回报。有没有办法做到这一点,而不构建一个自定义模糊功能?
希望有这样的事情:
import scipy
blurredImage = scipy.ndimage.filters.gaussian_filter(img, sigma = 3, weight = myMask)@stefan:
blur = 3
invmask = np.logical_not(mask).astype(int)
masked = img * mask
remaining = img * invmask
blurred = scipy.ndimage.filters.gaussian_filter(masked, sigma = blur)
blurred = blurred+remaining扩张法:
blur = 3
invmask = np.logical_not(mask).astype(int)
masked = img * mask
masked2 = scipy.ndimage.morphology.grey_dilation(masked,size=(5,5))
masked2 = masked2 *invmask
masked2 = masked + masked2
blurred = scipy.ndimage.filters.gaussian_filter(masked2, sigma = blur)发布于 2020-01-10 16:56:41
将线性滤波器应用于有限域的正确方法是使用归一化卷积。该方法计算(加权)每个邻域内的像素数,然后用该邻域内的(加权)像素数进行归一化。它只使用过滤器的两个应用程序和一些微不足道的每个像素操作就可以做到这一点:
# normalized convolution of image with mask
filter = scipy.ndimage.filters.gaussian_filter(img * mask, sigma = blur)
weights = scipy.ndimage.filters.gaussian_filter(mask, sigma = blur)
filter /= weights
# after normalized convolution, you can choose to delete any data outside the mask:
filter *= mask请注意,mask不需要仅为0和1,它可以包含中间值,指示您如何“确定”该像素值的正确性。但通常情况下,“缺失数据”只有0,可用数据只有1。
gaussian_filter必须以浮点格式进行计算,并返回浮点值图像.整数运算在这里不会做正确的事情。
下面是一个例子:

发布于 2020-01-10 16:56:33
你愿意达到的目标是不安的,没有你想象的那么明确。
模糊运算对应于每个像素邻域内像素的一些(各向同性)平均值。但是在域的边界附近,邻居是不完整的,您需要修复它。
对于第一种方法,您可以按照以下方式劫持标准过滤器:
如果图像是整数类型,则使用255而不是1来保持足够的精度。注意,在ROI之外,这些比率将有一个零分母。
https://stackoverflow.com/questions/59685140
复制相似问题