【问题标题】:Removing 'noise' or 'holes' from image [closed]从图像中去除“噪音”或“孔洞”[关闭]
【发布时间】:2020-09-09 01:44:02
【问题描述】:

所以我有一个灰度图像(二维矩阵,单元格值范围从 0.0 到 1.0)。我正在使用 python 操作它。

我希望它的值会逐渐变化,但它带有一些明显不受欢迎的“伪影”,如下图红色标记的那个(以及周围的其他)。

是否有一个已经实现的库(或已知算法)以编程方式“填充”它们,有点像“周围像素的加权平均值”? 它们可以被描述为“被 -0.1 或更小的值梯度包围的像素组”。

【问题讨论】:

标签: python numpy computer-vision noise-reduction


【解决方案1】:

有趣的问题,我编写了一个程序,它将递归地循环遍历图像并通过平均像素来平滑像素。它查找超过一定大小的绝对值,如果检测到,将对这两个值进行平均,重建矩阵。让我知道你的想法:

from statistics import mean
myimage = [
    [0,0,0,0,.1],
    [0,.1,3,1,.1],
    [1,.1,4,.2,.1],
    [0,1,0,0,.1],
    [.1,.9,0,0,.1]
]
def smooth(matrix, delta):
    noise=0
    reduction=matrix.copy()
    for i,row in enumerate(matrix):
        for j,pixel in enumerate(row):
            if j<len(row)-1:
                if (abs(row[j]-row[j+1]))>=delta:
                    noise=1
                    av = mean([row[j],row[j+1]])
                    mv,iv=max((v,i) for i,v in enumerate((row[j],row[j+1])))
                    if iv==0:
                        reduction[i][j]=av
                    else:
                        reduction[i][j+1]=av
            if i<len(matrix)-1:
                if abs(row[j]-matrix[i+1][j])>=delta:
                    noise=1
                    av = mean([row[j],matrix[i+1][j]])
                    mv,iv=max((v,i) for i,v in enumerate((row[j],matrix[i+1][j])))
                    if iv==0:
                        reduction[i][j]=av
                    else:
                        reduction[i+1][j]=av

    if noise==1:
        return smooth(reduction, delta)
    else:
        return reduction

x=smooth(myimage, 0.5)
for line in x:
    print(line)  


#[0, 0, 0, 0, 0.1]
#[0, 0.1, 0.4, 0.25, 0.1]
#[0.25, 0.1, 0.3625, 0.2, 0.1]
#[0, 0.275, 0, 0, 0.1]
#[0.1, 0.29375, 0, 0, 0.1]

【讨论】:

  • 感谢您与我分享代码,巴克。但我不是在寻找一种平滑画面的方法,只是为了“填补特定的漏洞”。 furas 建议的修复工具更接近我想要的。
猜你喜欢
  • 2012-03-01
  • 2017-07-07
  • 2021-08-02
  • 2011-02-19
  • 2014-05-22
  • 2013-10-07
  • 1970-01-01
  • 2021-08-16
  • 2011-12-30
相关资源
最近更新 更多