如何在OpenCV中锐化图像?

Aru*_*iRC 112 opencv image-processing

如何使用OpenCV锐化图像?有许多平滑或模糊的方法,但没有我能看到的锐化.

eta*_*ion 151

关于反锐化掩模的维基百科文章中列出了一个通用程序:使用高斯平滑滤波器并从原始图像中减去平滑后的版本(以加权方式,以便恒定区域的值保持不变).

要获得锐化形式frameimage:(两者cv::Mat)

cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);
Run Code Online (Sandbox Code Playgroud)

您需要为自己调整参数.

还有laplacian锐化,你应该在谷歌上找到一些东西.


Bri*_*rns 36

你可以尝试一个简单的内核filter2D函数,例如在Python中:

kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
im = cv2.filter2D(im, -1, kernel)
Run Code Online (Sandbox Code Playgroud)

维基百科对内核有一个很好的概述,其中有更多的例子 - https://en.wikipedia.org/wiki/Kernel_(image_processing)

在图像处理中,内核,卷积矩阵或掩码是一个小矩阵.它用于模糊,锐化,压花,边缘检测等.这是通过在内核和图像之间进行卷积来实现的.

  • 这基本上是“拉普拉斯”过滤器(8 个邻居)。它增强了边缘、角落等高频区域。4-邻居拉普拉斯滤波器:[[0,-1,0],[-1,5,-1],[0,-1,0]]。 (2认同)

stu*_*men 13

您可以在OpenCV文档中使用"非锐化掩码"算法找到有关锐化图像的示例代码

改变价值观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);
Run Code Online (Sandbox Code Playgroud)


Ste*_*son 9

为了清楚说明这个主题,确实应该提出几点:

  1. 锐化图像是一个不适定的问题。换句话说,模糊是一种有损操作,通常不可能从它返回。

  2. 要锐化单个图像,您需要以某种方式对您想要的图像类型以及它如何变得模糊添加约束(假设)。这是自然图像统计的领域。进行锐化的方法在其算法中显式或隐式地保存这些统计数据(深度学习是最隐式编码的)。对DOG 或拉普拉斯金字塔分解的某些级别进行加权的常用方法,这是 Brian Burns 答案的概括,假设高斯模糊破坏了图像,并且如何进行加权与对什么的假设有关在图像开始。

  3. 其他信息来源可以使问题尖锐化。常见的此类信息源是移动对象的视频或多视图设置。在这种情况下锐化通常被称为超分辨率(这是一个非常糟糕的名字,但它一直停留在学术界)。很长一段时间以来,OpenCV 中一直存在超分辨率方法......虽然它们通常不能很好地解决实际问题,但最后我检查了它们。我希望深度学习在这里也能产生一些美妙的结果。也许有人会发表评论什么是值得的。


小智 7

任何图像都是各种频率信号的集合。较高的频率控制边缘,较低的频率控制图像内容。当从一个像素值到另一个像素值(如相邻单元中的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()
Run Code Online (Sandbox Code Playgroud)

还有另一种从明亮版本的图像中减去模糊版本的方法。这有助于锐化图像。但是应谨慎行事,因为我们只是在增加像素值。想象一下灰度像素值190,如果将其乘以2的权重,则得到380,但是由于最大允许像素范围而被修剪为255。这是信息丢失,并导致图像褪色。

addWeighted(frame, 1.5, image, -0.5, 0, image);
Run Code Online (Sandbox Code Playgroud)


小智 6

您也可以尝试这个过滤器

sharpen_filter = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
sharped_img = cv2.filter2D(image, -1, sharpen_filter)
Run Code Online (Sandbox Code Playgroud)


Sor*_*ush 5

您可以使用不清晰的蒙版来锐化图像。您可以在此处找到有关锐化遮罩的更多信息。这是使用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)
Run Code Online (Sandbox Code Playgroud)

  • @choise `amount` 只是锐化量。例如,与默认值 1.0 相比,2.0 的 `amount` 提供了更清晰的图像。`threshold` 是低对比度蒙版的阈值。换句话说,输入图像和模糊图像之间的差异小于“阈值”的像素将保持不变。 (2认同)