1、灰度直方图
1.1 基本概念和作用
表示图像中每个灰度级别的像素数量。用于分析图像的亮度分布情况。
1.2 代码示例
参数介绍
hist = cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)-images:输入图像的列表。对于灰度图像,它只包含一个元素(即一幅图像)。对于彩色图像,通常会传入一个包含所有颜色通道的列表。
-channels:指定要统计直方图的通道。对于灰度图像,值为[0];对于彩色图像,可以传入[0]、[1]、[2]分别表示蓝、绿、红通道。如果是彩色图像,也可以同时统计多个通道,例如[0, 1, 2]表示统计所有通道。
-mask:可选参数,用于指定计算直方图的区域。如果不需要指定区域,传入None
-histSize:指定直方图的大小,即灰度级别的个数。对于灰度图像,通常设置为256,表示从0到255的灰度级别。对于彩色图像,可以设置为256,表示每个通道的灰度级别。
-ranges:指定像素值的范围。通常为[0, 256],表示灰度级别的范围。对于彩色图像,例如[0, 256, 0, 256, 0, 256]表示三个通道各自的范围。
-hist:可选参数,用于存储计算得到的直方图。如果不提供,函数会返回直方图
-accumulate:
示例
import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('../images/1.jpg', cv2.IMREAD_GRAYSCALE)# 计算灰度直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])# 显示原图
plt.subplot(2, 1, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')# 显示灰度直方图
plt.subplot(2, 1, 2)
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')# 调整子图布局,避免重叠
plt.tight_layout()# 显示图像和直方图
plt.show()
2、BGR直方图
2.1 基本概念和作用
BGR直方图是一种用于可视化彩色图像中蓝色(Blue)、绿色(Green)和红色(Red)三个通道的像素值分布情况的工具。了解图像中颜色的分布情况。通过分析BGR直方图,可以得知图像中某个颜色通道的强度,从而更好地理解图像的颜色特性。
2.2 代码示例
import cv2
import matplotlib.pyplot as plt# 读取彩色图像
image = cv2.imread('../images/2.jpg')# 分离通道
b, g, r = cv2.split(image)# 计算各通道的直方图
hist_b = cv2.calcHist([b], [0], None, [256], [0, 256])
hist_g = cv2.calcHist([g], [0], None, [256], [0, 256])
hist_r = cv2.calcHist([r], [0], None, [256], [0, 256])# 显示彩色图像
plt.subplot(2, 1, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')# 显示BGR直方图
plt.subplot(2, 1, 2)
plt.plot(hist_b, color='blue', label='Blue')
plt.plot(hist_g, color='green', label='Green')
plt.plot(hist_r, color='red', label='Red')
plt.title('BGR Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.legend()# 调整子图布局,避免重叠
plt.tight_layout()
# 显示图像和直方图
plt.show()
3、灰度直方图均衡
1. 基本概念和作用
用于增强图像对比度的技术,通过调整图像中各个灰度级别的像素分布,使得整个灰度范围更均匀地覆盖,从而提高图像的视觉质量。这个过程可以使暗部和亮部细节更加清晰可见,改善图像的视觉效果。
2. 代码示例
import cv2
import matplotlib.pyplot as plt# 读取灰度图像
image = cv2.imread('../images/3.jpg', cv2.IMREAD_GRAYSCALE)# 进行灰度直方图均衡
equalized_image = cv2.equalizeHist(image)# 显示原始灰度图像
plt.subplot(2, 1, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Grayscale Image')# 显示均衡后的灰度图像
plt.subplot(2, 1, 2)
plt.imshow(equalized_image, cmap='gray')
plt.title('Equalized Grayscale Image')# 调整子图布局,避免重叠
plt.tight_layout()# 显示图像
plt.show()
4、直方图变换(查找)
4.1 基本概念和作用
直方图变换,也称为直方图查找,是一种用于调整图像对比度的技术。它通过变换图像的灰度级别,将原始图像的灰度分布均匀化,使得图像中所有灰度级别的像素值分布更加平均。这样可以增强图像的对比度,使细节更加突出,提高图像的视觉质量。
直方图变换的核心思想是调整图像中各个灰度级别的像素值,使得灰度值的分布更均匀,从而实现对比度的增强。
4.2 代码示例
# 1 导入库
import cv2
import matplotlib.pyplot as plt
import numpy as np# 2 方法:显示图片
def show_image(image, title, pos):# 顺序转换:BGR TO RGBimage_RGB = image[:, :, ::-1] # shape : (height, width, channel)# 显示标题plt.title(title)plt.subplot(2, 3, pos) # 定位plt.imshow(image_RGB)# 3 方法:显示图片的灰度直方图
def show_histogram(hist, title, pos, color):# 显示标题plt.title(title)plt.subplot(2, 3, pos) # 定位图片plt.xlabel("Bins") # 横轴信息plt.ylabel("Pixels") # 纵轴信息plt.xlim([0, 256]) # 范围plt.plot(hist, color=color) # 绘制直方图# 4 主函数 main()
def main():# 5 创建画布plt.figure(figsize=(15, 6)) # 画布大小plt.suptitle("Gray Image Histogram", fontsize=14, fontweight="bold") # 设置标题形式# 6 加载图片img = cv2.imread("../images/4.jpg")# 7 灰度转换img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 8 计算灰度图的直方图hist_img = cv2.calcHist([img_gray], [0], None, [256], [0, 256])# 9 展示灰度直方图# 灰度图转换成BGR格式图片img_BGR = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2BGR)show_image(img_BGR, "BGR image", 1)show_histogram(hist_img, "gray image histogram", 4, "m")# 10 对图片中的每个像素值增加50个像素M = np.ones(img_gray.shape, np.uint8) * 50 # 构建矩阵added_img = cv2.add(img_gray, M)add_img_hist = cv2.calcHist([added_img], [0], None, [256], [0, 256]) # 计算直方图added_img_BGR = cv2.cvtColor(added_img, cv2.COLOR_GRAY2BGR)show_image(added_img_BGR, "added image", 2)show_histogram(add_img_hist, "added image hist", 5, "m")# 11 对图片中的每个像素值减去50个像素subtract_img = cv2.subtract(img_gray, M)subtract_img_hist = cv2.calcHist([subtract_img], [0], None, [256], [0, 256]) # 计算直方图subtract_img_BGR = cv2.cvtColor(subtract_img, cv2.COLOR_GRAY2BGR)show_image(subtract_img_BGR, "subtracted image", 3)show_histogram(subtract_img_hist, "subtracted image hist", 6, "m")plt.show()if __name__ == '__main__':main()
图片中每个像素都增加五十个像素和减少五十像素的效果