图像去模糊

时间:2018-07-12 15:34:45

标签: python opencv rgb scikit-image grayscale

此帖子分为两部分


第一部分

我在将图像从灰度转换回RGB时遇到了一个小问题。

相关图片:

enter image description here

我使用以下代码对其进行转换:

equ = cv2.cvtColor(equ, cv2.COLOR_GRAY2RGB)

尽管没有成功...


第二部分

此外,我需要对此类图像进行模糊处理。 Here我发现了一些使用维纳过滤器的代码,但是当我实现它时,它似乎无法有效地工作。这是代码:

psf = np.ones((5, 5)) / 25
img = convolve2d(equ, psf, 'same')
img += 0.1 * img.std() * np.random.standard_normal(img.shape)
#deconvolved_img = restoration.wiener(img, psf, 1100)
deconvolved = restoration.wiener(img, psf, 1, clip=False)
plt.imshow(deconvolved, cmap='gray')

这是输出:

enter image description here

非常感谢您对这两个问题的帮助!

1 个答案:

答案 0 :(得分:2)

要使彩色图像均匀化,看来要做的一件事是

  • 将图像转换为HSV或YUV
  • 将图像拆分为单独的分量(例如,H,S,V)
  • 在价值渠道(或全部三个渠道)上均衡化
  • 将频道合并在一起

    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    split = cv2.split(hsv)  # split is a 3D array containing H S V info
    split[2] = cv2.equalizeHist(split[2])
    hsv = cv2.merge(split)
    img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    

对于“去模糊”,有时会使用不清晰的蒙版。在Wikipedia page on unsharp masking中,此操作的公式为

  

锐化=原始+(原始-模糊)×数量

可以重新排列为

  

锐化=原始×(1 +数量)+模糊×(-数量)

维基百科说amount的一个好的起点是0.5到1.5。在我的应用程序中,我有一个Spinbox,让它在0到10之间变化。对于模糊,我使用内核大小在1到31(必须为奇数和整数)之间的高斯模糊。为了进行矩阵数学运算,我更喜欢使用OpenCV函数,因为它们通常比NumPy更快,并且通常会将它们自动缩放到0到25​​5之间的值(例如8位和8位/ 3通道图像)。这里我们使用addWeighted

  

dst = src1 * alpha + src2 * beta + gamma;

amount = 1.5
ksize = 3
blur = cv2.GaussianBlur(img, ksize, 0, 0)
unsharp = cv.addWeighted(img, 1 + amount, blur, -amount, 0)