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 RGB
image_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()
图片中每个像素都增加五十个像素和减少五十像素的效果