如何使用 OpenCV 锐化图像?
有很多平滑或模糊的方法,但我没有看到锐化的方法。
维基百科关于锐化遮罩的文章中列出了一个一般程序:
您使用高斯平滑滤波器并从原始图像中减去平滑版本(以加权方式,以便恒定区域的值保持恒定)。要将
frame
的锐化版本转换为
image
:(都是
cv::Mat
)
cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);
参数有些东西需要你自己调整。还有拉普拉斯锐化,当你谷歌时你应该找到一些东西。
不锐化蒙版锐化图像。您可以在此处找到有关锐化遮罩的更多信息。这是使用 OpenCV 的 Python 实现:
import cv2 as cv
import numpy as np
def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0):
"""Return a sharpened version of the image, using an unsharp mask."""
blurred = cv.GaussianBlur(image, kernel_size, sigma)
sharpened = float(amount + 1) * image - float(amount) * blurred
sharpened = np.maximum(sharpened, np.zeros(sharpened.shape))
sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape))
sharpened = sharpened.round().astype(np.uint8)
if threshold > 0:
low_contrast_mask = np.absolute(image - blurred) < threshold
np.copyto(sharpened, image, where=low_contrast_mask)
return sharpened
def example():
image = cv.imread('my-image.jpg')
sharpened_image = unsharp_mask(image)
cv.imwrite('my-sharpened-image.jpg', sharpened_image)
任何图像都是各种频率信号的集合。这 较高频率控制边缘,较低频率控制 图像内容。当有急剧过渡时就会形成边缘 从一个像素值到另一个像素值,例如 0 和 255 相邻的单元格。显然有一个急剧的变化,因此边缘 和高频。为了锐化图像,这些过渡可以是 进一步增强。一种方法是将自制的滤波器内核与图像进行卷积。
import cv2
import numpy as np
image = cv2.imread('images/input.jpg')
kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
sharpened = cv2.filter2D(image, -1, kernel) # applying the sharpening kernel to the input image & displaying it.
cv2.imshow('Image Sharpening', sharpened)
cv2.waitKey(0)
cv2.destroyAllWindows()
还有另一种方法可以从图像的明亮版本中减去图像的模糊版本。这有助于锐化图像。但应该谨慎行事,因为我们只是增加像素值。想象一下灰度像素值 190,如果乘以权重 2,则为 380,但由于最大允许像素范围而被修剪为 255。这是信息丢失并导致图像褪色。
addWeighted(frame, 1.5, image, -0.5, 0, image);
OpenCV文档中找到有关使用“unsharp mask”算法锐化图像的示例代码。
更改sigma
、
threshold
、
amount
的值会产生不同的结果。
// sharpen image using "unsharp mask" algorithm
Mat blurred; double sigma = 1, threshold = 5, amount = 1;
GaussianBlur(img, blurred, Size(), sigma, sigma);
Mat lowContrastMask = abs(img - blurred) < threshold;
Mat sharpened = img*(1+amount) + blurred*(-amount);
img.copyTo(sharpened, lowContrastMask);
DOG或拉普拉斯金字塔分解的某些级别进行加权的常见方法是Brian Burns答案的概括,假设高斯模糊破坏了图像,并且如何进行加权与以下假设有关:图像中一开始是什么。
超分辨率方法很长一段时间了……尽管它们通常不能很好地解决实际问题,上次我检查了它们。我预计深度学习在这里也能产生一些精彩的结果。也许有人会发表评论,评论那里有什么值得的。
sharpen_filter = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
sharped_img = cv2.filter2D(image, -1, sharpen_filter)
要锐化图像,我们可以使用滤镜(如之前的许多答案中所示)
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32)
kernel /= denominator * kernel
分母为1时最大,随着增加而减少(2.3..)最常用的是分母为3时。
下面是实现。
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32)
kernel = 1/3 * kernel
dst = cv2.filter2D(image, -1, kernel)
将 numpy 导入为 np
导入CV2
图像 = cv2.imread(r"D: itesh\Dinesh.jpg")
图像 = cv2.cvtColor(图像, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(20, 20))
plt.子图(1,2,1)
plt.title(“原文”)
plt.imshow(图像)
kernel_sharpening = np.array([[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]])
锐化= cv2.filter2D(图像,-1,kernel_sharpening)plt.子图(1,2,2)
plt.title(“图像锐化”)
plt.imshow(锐化)
plt.show()