本文共 2303 字,大约阅读时间需要 7 分钟。
在图像处理领域,YUV是一种常用的颜色空间,它将图像分解为三个通道:
通过将RGB颜色空间转换为YUV,可以更好地适应不同类型的显示设备和网络环境。
在代码中,首先需要将输入图像从RGB转换为YUV格式。使用OpenCV库中的cv.cvtColor函数,可以轻松实现这一转换,参数设置为COLOR_BGR2YUV。
import cv2 as cvimg = cv.imread('../images/scene_001.jpg')yuv = cv.cvtColor(img, cv.COLOR_BGR2YUV) 直方图均衡化是一种增强图像对比度的方法,通过调整图像的亮度分布,使得图像的亮度和色调更加均匀。常用的均衡化方法包括直方图均衡化和反直方图均衡化。
在本文中,主要对Y分量进行均衡化。Y分量对应图像的亮度,通过对Y分量的直方图进行均衡化,可以显著提升图像的对比度。
y_img = yuv.copy()y_const = 255y_img[:, :, 1] = y_consty_img[:, :, 2] = y_const
在调整完Y分量后,可以对U和V分量进行相应的调整,以进一步优化图像效果。
u_img = yuv.copy()u_img[:, :, 0] = y_constv_img = yuv.copy()v_img[:, :, 1] = y_const
通过直方图均衡化处理后的图像,可以看到图像的亮度和色调更加均匀,细节更加丰富。
以下是完整的代码实现,展示了从YUV转换到直方图均衡化的整个流程。
import cv2 as cvimport numpy as npimport matplotlib.pyplot as pltimg = cv.imread('../images/scene_001.jpg')yuv = cv.cvtColor(img, cv.COLOR_BGR2YUV)hist_size = 256# 直方图均衡化y_hist = np.array(cv.calcHist(img, [0], None, [hist_size], [0, hist_size - 1])).reshape(hist_size)fig, ax = plt.subplots(5, 2, figsize=(8, 8))# 显示原始图像ax[0][0].set_title('原图')ax[0][0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))ax[0][0].axis('off')# 绘制Y分量直方图ax[0][1].set_title('Y直方图')ax[0][1].hist(y_hist, 50)# 直方图均衡化函数def equalize(adjust_ratio, subplot): # 克隆YUV图像 yuv_equal = yuv.copy() # 调整Y分量 for row in yuv_equal: for col in row: col[0] = y_hist_equal[int(col[0])] # 计算均衡化后的直方图 y_hist_equal = np.array(cv.calcHist(yuv_equal, [0], None, [hist_size], [0, hist_size - 1])).reshape(hist_size) # 绘制处理后的图像 ax[subplot][0].set_title(f'均衡化(ratio={adjust_ratio})') ax[subplot][0].imshow(cv.cvtColor(yuv_equal, cv.COLOR_YUV2RGB)) ax[subtotal][0].axis('off') # 绘制均衡化后的直方图 ax[subtotal][1].set_title('均衡化Y直方图') ax[subtotal][1].hist(y_hist_equal, 50)# 调用均衡化函数equalize(0, 1)equalize(0.33, 2)equalize(0.66, 3)equalize(1, 4)plt.show() 通过直方图均衡化处理,图像的亮度和色调更加均匀,细节更加丰富。不同亮度和色调的区域对比度显著增强,图像整体质量得到提升。
cv.imread读取输入图像。cv.cvtColor将RGB图像转换为YUV格式。equalize对Y分量进行直方图均衡化,并调整U和V分量。通过上述步骤,可以实现将RGB图像转换为YUV格式,并对Y分量进行直方图均衡化,从而提升图像质量。
转载地址:http://zhfqz.baihongyu.com/