Python 使用scikit图像对图像进行去模糊

Python 使用scikit图像对图像进行去模糊,python,numpy,image-processing,scipy,scikit-image,Python,Numpy,Image Processing,Scipy,Scikit Image,我试图使用,但我总是以一堆1(或-1)的图像结束,我做错了什么?原始图像来自 输出: [[ 1. -1. 1. ..., 1. -1. -1.] [-1. -1. 1. ..., -1. 1. 1.] [ 1. 1. 1. ..., 1. 1. 1.] ..., [ 1. 1. 1. ..., 1. -1. 1.] [ 1. 1. 1. ..., -1. 1. -1.] [ 1. 1. 1. ..., -1. 1. 1.]] [[ 62.

我试图使用,但我总是以一堆1(或-1)的图像结束,我做错了什么?原始图像来自

输出:

[[ 1. -1.  1. ...,  1. -1. -1.]
 [-1. -1.  1. ..., -1.  1.  1.]
 [ 1.  1.  1. ...,  1.  1.  1.]
 ..., 
 [ 1.  1.  1. ...,  1. -1.  1.]
 [ 1.  1.  1. ..., -1.  1. -1.]
 [ 1.  1.  1. ..., -1.  1.  1.]]
[[  62.73526298   77.84202199   94.1563234  ...,   85.12442365
    69.80579057   48.74330501]
 [  74.79638704  101.6248559   143.09978769 ...,  100.07197414
    94.34431216   59.72199141]
 [  96.41589893  132.53865314  161.8286996  ...,  137.17602535
   117.72691238   80.38638741]
 ..., 
 [  82.87641732  122.23168689  146.14129645 ...,  102.01214025
    75.03217549   59.78417916]
 [  74.25240964  100.64285679  127.38475015 ...,   88.04694654
    66.34568789   46.72457454]
 [  42.53382524   79.48377311   88.65000364 ...,   50.84624022
    36.45044106   33.22771889]]

我尝试了几种价值观。我遗漏了什么?

到目前为止,我最好的解决方案是:

import numpy as np
#import matplotlib.pyplot as plt
from scipy.misc import imfilter, imread
from skimage import color, data, restoration
from scipy.signal import convolve2d as conv2

def main():
  image = imread("/Users/gsamaras/Downloads/boat.tif")
  #plt.imshow(arr, cmap='gray')
  #plt.show()
  #blurred_arr = imfilter(arr, "blur")
  psf = np.ones((5, 5)) / 25
  image = conv2(image, psf, 'same')
  image += 0.1 * image.std() * np.random.standard_normal(image.shape)

  deconvolved = restoration.wiener(image, psf, 1, clip=False)
  #print deconvolved
  plt.imshow(deconvolved, cmap='gray')
  plt.show()
  #print image

if __name__ == "__main__":
    main()
restoration.wiener()
中的值要小得多,这会导致图像看起来像是在其上方放置了一个不透明的覆盖层(如)。另一方面,随着该值的增大,图像越来越模糊。接近1的值似乎效果最好,可以消除图像的模糊

值得注意的是,该值越小(我的意思是,图像大小越大)



PS-我愿意接受新的答案。

到目前为止,我最好的解决方案是:

import numpy as np
#import matplotlib.pyplot as plt
from scipy.misc import imfilter, imread
from skimage import color, data, restoration
from scipy.signal import convolve2d as conv2

def main():
  image = imread("/Users/gsamaras/Downloads/boat.tif")
  #plt.imshow(arr, cmap='gray')
  #plt.show()
  #blurred_arr = imfilter(arr, "blur")
  psf = np.ones((5, 5)) / 25
  image = conv2(image, psf, 'same')
  image += 0.1 * image.std() * np.random.standard_normal(image.shape)

  deconvolved = restoration.wiener(image, psf, 1, clip=False)
  #print deconvolved
  plt.imshow(deconvolved, cmap='gray')
  plt.show()
  #print image

if __name__ == "__main__":
    main()
restoration.wiener()
中的值小得多会导致图像看起来像是在其上方放置了一个不透明的覆盖层(如)。另一方面,随着该值的增大,图像会越来越模糊。接近1的值似乎效果最好,可以消除图像的模糊

值得注意的是,该值越小(我的意思是,图像大小越大)



PS-我乐于接受新的答案。

如果不使用每个人都可以使用的标准映像,很难进行调试。您应该使用
clip=False
作为开始,以查看过滤器生成的值是哪种类型(如文档中所述,这些值会自动剪裁为-1,1)。也许过滤器希望您准备0,1浮点范围内的输入(例如,使用img_作为浮点数)但我不确定;我也会尝试。备注:在我所知道的所有基于ML的公式中,调节变量总是正的。我会害怕使用像
-100000
这样的东西。如果用它来平衡两个分量,总是可以使用pos-vals。我对这个过滤器没有任何理论上的想法,但检查f或者在文档中创建一个公式,然后想想你的平衡变量是否为负值。那么可能会产生什么样的影响。也许这是你问题的原因之一。但我只是在猜测。@sascha更新,
clip=False
必须是答案!你可以自己检查一下,我已经共享了公开图像的链接。这个负值是一个令人失望的结果评分尝试。我觉得该值应该接近10^-4,或者其他值……1似乎效果最好!:O您想发布一个答案吗?;)我觉得这还不足以回答问题。它看起来确实归结为关于图像表示的假设(0-1浮动与0-255浮动相比,后者似乎不是一件好事,因为我认为scikit learn中的0-255范围通常基于uint8)。剪裁也是默认设置,需要对您使用的输入类型进行一些实验。我很高兴它现在对您起作用,但我认为关于这些隐藏的假设还有更多需要发现的地方(我认为文档中有一个关于文档中的类型和范围的特殊部分)。也许img_as_float before更简洁@sascha图像在链接中,代码也在那里,如果你愿意,你可以自己尝试一下!:)如果不使用每个人都可以使用的标准映像,则很难进行调试。您应该使用
clip=False
作为开始,以查看筛选器生成的是哪种类型的值(如文档中所述,这些值会自动剪裁为-1,1)。可能筛选器希望您准备0,1浮点范围内的输入(例如,使用img\u as\u float)但我不确定;我也会尝试。备注:在我所知道的所有基于ML的公式中,调节变量总是正的。我会害怕使用像
-100000
这样的东西。如果用它来平衡两个分量,总是可以使用pos-vals。我对这个过滤器没有任何理论上的想法,但检查f或者在文档中创建一个公式,然后想想你的平衡变量是否为负值。那么可能会产生什么样的影响。也许这是你问题的原因之一。但我只是在猜测。@sascha更新,
clip=False
必须是答案!你可以自己检查一下,我已经共享了公开图像的链接。这个负值是一个令人失望的结果评分尝试。我觉得该值应该接近10^-4,或者其他值……1似乎效果最好!:O您想发布一个答案吗?;)我觉得这还不足以回答问题。它看起来确实归结为关于图像表示的假设(0-1浮动与0-255浮动相比,后者似乎不是一件好事,因为我认为scikit learn中的0-255范围通常基于uint8)。剪裁也是默认设置,需要对您使用的输入类型进行一些实验。我很高兴它现在对您起作用,但我认为关于这些隐藏的假设还有更多需要发现的地方(我认为文档中有一个关于文档中的这些类型和范围的特殊部分)。也许之前的img_as_float更简洁@sascha图像在链接中,代码也在那里,如果你愿意,你可以自己尝试一下!:)你也可以尝试使用
[[-1,-1],-1,8,-1],-1,-1,-1]]
Hmm@JeruLuke,正如我的首相所说,我愿意接受新的答案,所以你可以发布一个,解释你的评论!(=我还看到你没有投票给我的答案,不管你读了它-这意味着我应该删除它吗?我通常使用OpenCV。我没有尝试过你的代码片段。不投票,我根本不是说你应该删除它。因为上面提到的矩阵对我有效,我想提及它,仅此而已。:)你也可以试着用
[-1,-1,-1],-1,8,-1],-1,-1,-1].
Hmm@JeruLuke进行卷积,因为我的PM说我对新答案持开放态度,所以你可以发布一个,解释你的评论!(=我还看到你没有投票给我的答案,不管你读了它-这意味着我应该删除它吗?我通常使用OpenCV。我没有尝试过你的代码片段。不投票,我根本不是说你应该删除它。因为上面提到的矩阵对我有效,我想提及它,仅此而已。:)