opencv-python——图像增强(拉普拉斯锐化,直方图均衡,双边滤波)

题目1:请对下图进行锐化处理,使其更清晰。

拉普拉斯算子是一种基于图像二阶微分的算子,可以用于图像锐化处理。通过对图像进行卷积操作,可以得到一个新的图像,其中包含了图像细节的更多信息。在这个新的图像中,明暗的变化更加剧烈,从而让图像看起来更加清晰。

拉普拉斯算子可以通过以下步骤进行图像锐化:

将原图像转换为灰度图像,仅保留亮度信息。

对灰度图像应用拉普拉斯算子卷积核,得到一个新的图像。

将产生的图像与原始图像相减,得到一个得到一个用于增强图像细节的高通滤波图像。

拉普拉斯算子锐化的原理就是通过增强图像中的高空频信息来增强图像的边缘、纹理等细节信息,从而使图像变得更加清晰。由于拉普拉斯算子是一种二阶微分算子,因此通过应用不同的卷积核可以得到不同的锐化效果,可以针对不同的图像进行调整。在实践中,通常与其他图像处理技术(如边缘检测、直方图均衡化等)结合使用,以获得更好的结果。

def LaplaceFilter(img):
   h, w, c = img.shape

   K_size = 3

   # 零填充
   pad = K_size // 2
   out = np.zeros((h + 2 * pad, w + 2 * pad, c), dtype=np.float64)
   out[pad:pad + h, pad:pad + w] = img.copy().astype(np.float64)

   K = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
   tmp = out.copy()
   for y in range(h):
       for x in range(w):
           for ci in range(c):
               out[pad + y, pad + x, ci] = np.sum(K * tmp[y:y + K_size, x:x + K_size, ci])

   out = out[pad:pad + h, pad:pad + w].astype(np.uint8)
   return out



def fun_01(img):


   # laplace算子
   img_laplace = LaplaceFilter(img)


   # 锐化图像=原始图像+(原始图像-模糊图像)
   im_fun_01 = cv2.convertScaleAbs(img - img_laplace*2)


   cv2.imshow("original.jpg", img)
   cv2.imshow("1.jpg", im_fun_01)
   cv2.waitKey(0)
   cv2.destroyAllWindows()


if __name__ == "__main__":
   img1 = cv2.imread("x-rayblog-gausian blur d4.jpg")
   fun_01(img1)

 结果图:

可以看到经过拉普拉斯锐化之后的图像之后,原本模糊的图像看起来更加清晰和鲜明。

题目2:请对下图进行增强,以使其达到较佳的图像显示效果

直方图均衡(Histogram equalization)是一种常见的图像增强方法,它可以将图像的直方图进行变换,使得图像的灰度级数分布更加均匀,从而增强图像的对比度和显示效果。

直方图均衡化分为以下步骤:

首先计算原始图像的直方图,即图像中每个灰度级别的像素数量。

计算原始图像的累积分布函数(Cumulative Distribution Function, CDF),以得到每个灰度级别在整幅图像中的出现概率。

将CDF比例化至最大灰度级别(即图像深度),计算出一个新的映射表,该映射表将原始图像中灰度级的值映射到直方图均衡化后的灰度级。

使用该新映射表将原始图像中的每个像素的灰度级转换为新的灰度级,并创建一张经过直方图均衡化的图像。

通过这个过程,直方图均衡能够扩展图像的动态范围,减少图像中像素强度值的方差,并增强图像的对比度,从而提高图像的视觉质量。

然后再使用下面两个卷积核进行图像锐化处理。

import cv2
import numpy as np
def Origin_histogram(img):
   # 建立原始图像各灰度级的灰度值与像素个数对应表
   histogram = {}
   for i in range(img.shape[0]):
       for j in range(img.shape[1]):
           k = img[i][j]
           if k in histogram:
               histogram[k] += 1
           else:
               histogram[k] = 1

   sorted_histogram = {}  # 建立排好序的映射表
   sorted_list = sorted(histogram)  # 根据灰度值进行从低至高的排序

   for j in range(len(sorted_list)):
       sorted_histogram[sorted_list[j]] = histogram[sorted_list[j]]

   return sorted_histogram


def equalization_histogram(histogram, img):
   pr = {}  # 建立概率分布映射表

   for i in histogram.keys():
       pr[i] = histogram[i] / (img.shape[0] * img.shape[1])

   tmp = 0
   for m in pr.keys():
       tmp += pr[m]
       pr[m] = max(histogram) * tmp

   new_img = np.zeros(shape=(img.shape[0], img.shape[1]), dtype=np.uint8)

   for k in range(img.shape[0]):
       for l in range(img.shape[1]):
           new_img[k][l] = pr[img[k][l]]

   return new_img

if __name__ == '__main__':
   # 读取原始图像
   img = cv2.imread('body_x_ray.jpg', cv2.IMREAD_GRAYSCALE)
   # 计算原图灰度直方图
   origin_histogram = Origin_histogram(img)
   # 直方图均衡化
   new_img1 = equalization_histogram(origin_histogram, img)

   K1 = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
   K2 = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
   img1 = cv2.filter2D(new_img1, -1, K1)
   img2 = cv2.filter2D(new_img1, -1, K2)
   new_img2 = cv2.add(cv2.add(img1, img2), new_img1)
   cv2.imshow('original.jpg', img)
   cv2.imshow('equalizeHist.jpg', new_img1)
   cv2.imshow('final.jpg', new_img2)
   cv2.imwrite('equalizeHist.jpg', new_img1)
   cv2.imwrite('final.jpg', new_img2)
   cv2.waitKey(0)
   cv2.destroyAllWindows()

结果图:

可以看到,图像经过直方图均衡和锐化操作之后,使得图像中的暗部和亮部区域更加明显,提高图像的可视化效果,同时模糊的骨架轮廓也变得更加清晰和鲜明。

题目3:请对下面图像进行祛斑或去皱处理。

 

双边滤波是一种图像处理中常用的滤波方法,它可以在一定程度上减少噪点,保留图像的边缘信息。它的作用包括:

去噪:双边滤波可以有效地减少图像中的高斯噪声、椒盐噪声等。

保边:传统的高斯滤波容易破坏图像的边缘信息,而双边滤波能够在去除噪声的同时保留图像的边缘。

图像增强:双边滤波可以使图像看起来更加清晰、锐利。

双边滤波是一种在去噪的同时能够保留图像边缘信息的有效方法,它在数字图像处理、计算机视觉等领域得到了广泛的应用。

然后我们在滤波后的图像上应用拉普拉斯滤波器,将处理后的结果与原始图像相加,从而强化图像中的轮廓和细节信息,提高图像的清晰度和锐度。拉普拉斯滤波器常被用于图像锐化,通过加强图像中的高频细节和边缘信息,让图像看起来更加清晰锐利。拉普拉斯算子通过计算图像中每个像素与周围像素值的差异来检测图像中的边缘,从而实现图像锐化的目的。

import numpy as np

img = cv2.imread('3.jpg')
new_img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
median_blur = cv2.medianBlur(img, 5)
bilateral_filter = cv2.bilateralFilter(img, 9, 75, 75)
K1 = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
img1 = cv2.filter2D(bilateral_filter, -1, K1)
new_img2 = bilateral_filter + img1
cv2.imshow('output.jpg', new_img2)
cv2.imwrite('3_result.jpg', new_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

 结果图:

 可以看到,经过双边滤波和拉普拉斯锐化后的图像,人脸上的斑点明显弱化了许多,进行了去斑的同时也保持了图像的高清晰度。

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F0reverBound

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值