删除彩色图像的晕影滤镜

Posted

技术标签:

【中文标题】删除彩色图像的晕影滤镜【英文标题】:Remove vignette filter of colored image 【发布时间】:2020-05-29 07:19:01 【问题描述】:

我是 Python OpenCV 图像处理的新手。我想删除图像的边框/轮廓阴影,如下所示。我检查了 'how to remove shadow from scanned images' 这对我不起作用。这甚至可能吗?

【问题讨论】:

看起来是不是像加亮图像? 如果我只是点亮整个图像,它会看起来像imgur.com/1DureNk。 Lightening 是以相同的比例增加整个像素值。因此,如果您对暗部分有一个阈值,并以比正常比例小的比例降低它们的像素值。这可能会产生良好的效果 我会试一试的。谢谢 我也会试试的,我也很好奇它会是什么样子。如果你得到好的结果,请自己回答问题 【参考方案1】:

您的边框/轮廓阴影问题让我想起了晕影滤镜。如果您想了解更多信息,可以查看此question。所以基本上我们的任务是去除晕影滤镜的效果,然后增加亮度。

#####VIGNETTE
import cv2
import numpy as np

img = cv2.imread('Paris.jpg')
height, width = img.shape[:2]
original = img.copy()
# generating vignette mask using Gaussian kernels
kernel_x = cv2.getGaussianKernel(width, 150)
kernel_y = cv2.getGaussianKernel(height, 150)
kernel = kernel_y * kernel_x.T
mask = 255 * kernel / np.linalg.norm(kernel)

# applying the mask to each channel in the input image
for i in range(3):
    img[:, :, i] = img[:, :, i] * mask


cv2.imshow('Original', original)
cv2.imshow('Vignette', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

为了对抗效果,将img[:, :, i] = img[:, :, i] * mask更改为img[:, :, i] = img[:, :, i] / mask

现在我们需要增加图像的亮度。为此,我们将图像转换为 HSV 并增加饱和度和值矩阵的值。要更详细地了解它,您可以参考这个article。

#THE FULL CODE
import cv2
import numpy as np

img = cv2.imread('shadow.jpg')
original = cv2.imread('bright.jpg')
height, width = img.shape[:2]
# generating vignette mask using Gaussian kernels
kernel_x = cv2.getGaussianKernel(width, 150)
kernel_y = cv2.getGaussianKernel(height, 150)
kernel = kernel_y * kernel_x.T
mask = 255 * kernel / np.linalg.norm(kernel)

test = img.copy()
for i in range(3):
    test[:, :, i] = test[:, :, i] / mask    

hsv = cv2.cvtColor(test, cv2.COLOR_BGR2HSV)
hsv = np.array(hsv, dtype = np.float64)
hsv[:,:,1] = hsv[:,:,1]*1.3 ## scale pixel values up or down for channel 1(Lightness)
hsv[:,:,1][hsv[:,:,1]>255]  = 255
hsv[:,:,2] = hsv[:,:,2]*1.3 ## scale pixel values up or down for channel 1(Lightness)
hsv[:,:,2][hsv[:,:,2]>255]  = 255
hsv = np.array(hsv, dtype = np.uint8)
test = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)


cv2.imshow('Original_bright', original)
cv2.imshow('Original_dark', img)
cv2.imshow('Result', test)
cv2.waitKey(0)
cv2.destroyAllWindows()

与原始明亮图像比较的结果。

如果没有反向晕影滤镜,结果会是什么样子。

【讨论】:

哇哦。谢谢你。你比我快很多。结果看起来很棒。谢谢 很高兴你喜欢它! 奇怪的表达式:mask = 255 * kernel / np.linalg.norm(kernel),为什么要使用frobenius norm?似乎你只需要在 0-1 范围内拟合内核,这就足够了。只需在内核中找到最小值和最大值并计算 kernel=(kernel-min)/(max-min) 或使用 cv.normalize 和 cv.NORM_MINMAX 标志。 如果我运行上面显示的VIGNETTE 代码,由于某种原因它会导致this。有人有同样的经历吗?

以上是关于删除彩色图像的晕影滤镜的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇204. 图像的色彩风格滤镜

图像滤镜处理算法:灰度黑白底片浮雕

带有大量晕影图像的 SIFT 特征检测

在 iOS 中应用模糊滤镜时如何从图像中删除黑色阴影矩形?

QHYCCD型号Q9进行LRGB拍摄操作记录

QHYCCD型号Q9进行LRGB拍摄操作记录