首页 > 解决方案 > 图像去模糊

问题描述

这篇文章分为两个


第一部分

我有一个小问题将图像从灰度转换回 RGB。

有问题的图片:

在此处输入图像描述

我使用这段代码来转换它:

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

虽然没有任何成功......


第二部分

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

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')

这是输出:

在此处输入图像描述

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

标签: pythonopencvrgbscikit-imagegrayscale

解决方案


要均衡彩色图像,似乎很常见的做法是

  • 将图像转换为 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。在我的应用程序中,我有一个旋转框,让它在 0 和 10 之间变化。对于模糊,我使用内核大小从 1 到 31(必须是奇数和整数)的高斯模糊。要进行矩阵数学运算,我更喜欢使用 OpenCV 函数,因为它们通常比 NumPy 更快,并且它们通常会自动缩放输出到 0 到 255 之间的值(例如,对于 8 位和 8 位/3 通道图像)。这里我们使用addWeighted

dst = src1*alpha + src2*beta + 伽玛;

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

推荐阅读