从零搭建 OpenCV 项目(新手向)-- 第六天 OpenCV图像预处理(五)

目录

一、直方图均衡化

1. 基本概念

1.1 什么是直方图?

1.2 什么是直方图均衡化(Histogram Equalization)?

1.3 应用场景

 2. 绘制直方图

 3. 直方图均衡化

3.1全局直方图均衡化

3.2 自适应直方图均衡化(CLAHE)

3.2.1 基本概念

 3.2.2 OpenCV 中的 CLAHE

3.2.3 案例

 ​编辑

3.3 对比度受限的自适应直方图均衡化

3.3.1 基本概念

3.3.2 案例

二、模板匹配

1. 基本概念

2. 典型应用场景

3. 匹配方法(OpenCV 提供 6 种)

3.1 平方差匹配(cv2.TM_SQDIFF)

3.2 归一化平方差匹配(cv2.TM_SQDIFF_NORMED)

3.3 相关匹配(cv2.TM_CCORR)

3.4 归一化相关匹配(cv2.TM_CCORR_NORMED)

3.5 相关系数匹配(cv2.TM_CCOEFF)

3.6 归一化相关系数匹配(cv2.TM_CCOEFF_NORMED)

 4. 绘制匹配成功轮廓的说明

5. 案例

三、霍夫变换

1. 基本概念

1.1 定义

1.2 基本思路

2. 应用场景

3. 霍夫直线变换(Standard Hough Line Transform)

3.1 原理

3.2 步骤

3.3 OpenCV 接口

3.4 案例

4. 统计概率霍夫直线变换(Probabilistic Hough Line Transform)

4.1 原理

4.2 OpenCV 接口

4.3 优点

4.4 案例 

5. 霍夫圆变换(Hough Circle Transform)

5.1 原理

5.2 OpenCV 接口

5.3 案例 

四、图像亮度变换

1. 基本概念

2. 亮度变换方式

2.1 线性变换(Linear Transform)

 2.2 直接像素值修改

五、形态学变换

1. 基本概念

2. 常用术语

2.1  核(Kernel / Structuring Element)

3. 基本操作

3.1 腐蚀(Erosion)

3.2 膨胀(Dilation)

4. 复合操作

4.1 开运算(Opening)

4.2 闭运算(Closing)

5. 其他形态学运算

5.1 礼帽运算(Top Hat)

5.2 黑帽运算(Black Hat)

5.3 形态学梯度(Morphological Gradient)

6. 应用场景

7. 案例


一、直方图均衡化

1. 基本概念

1.1 什么是直方图?

图像直方图是图像中像素灰度值分布的统计图,用于表示每个灰度级别(0–255)所拥有的像素数量。

  • 横轴:灰度级(0~255)

  • 纵轴:每个灰度级的像素个数

1.2 什么是直方图均衡化(Histogram Equalization)?

直方图均衡化是一种图像增强方法,用于改善图像的全局对比度。其核心思想是重新分配像素的灰度值,使得图像的灰度分布更加均匀,从而增强图像细节。

  • 原图直方图可能集中在某一区间(图像偏暗或偏亮)

  • 经过均衡化后,灰度分布更“平坦”,对比度提高

1.3 应用场景

  • 医学图像增强

  • 卫星图像增强

  • 文档图像增强(如扫描件)

  • 夜间监控、低光图像增强

 2. 绘制直方图

就是以像素值为横坐标,像素值的个数为纵坐标绘制一个统计图。

hist=cv2.calcHist(images, channels, mask, histSize, ranges)

 各个值介绍:

  • images:输入图像列表,可以是一幅或多幅图像(通常是灰度图像或者彩色图像的各个通道)。

  • channels:一个包含整数的列表,指示在每个图像上计算直方图的通道编号。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。

  • mask(可选):一个与输入图像尺寸相同的二值掩模图像,其中非零元素标记了参与直方图计算的区域,None为全部计算。

  • histSize:一个整数列表,也就是直方图的区间个数(BIN 的数目)。用中括号括起来,例如:[256]。

  • ranges:每维数据的取值范围,它是一个二维列表,每一维对应一个通道的最小值和最大值,例如对灰度图像可能是 [0, 256]

返回值:hist 是一个长度为255的数组,数组中的每个值表示图像中对应灰度等级的像素计数

 获取直方图的最小值、最大值及其对应最小值的位置索引、最大值的位置索引: 

 minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)

API:

cv2.line(img, pt1, pt2, color, thickness)
  • img:原始图像,即要在上面画线的numpy数组(一般为uint8类型)。

  • pt1pt2:分别为线段的起点和终点坐标,它们都是元组类型,例如 (x1, y1)(x2, y2) 分别代表线段两端的横纵坐标。

  • color:线段的颜色,通常是一个包含三个元素的元组 (B, G, R) 表示BGR色彩空间的像素值,也可以是灰度图像的一个整数值。

  • thickness:线段的宽度,默认值是1,如果设置为负数,则线宽会被填充。

案例:

import cv2 as cv
import numpy as np
#读图
bg = cv.imread("D:\OpenCV_notes\day05\images\\bg.png")
#创建黑图,绘制直方图
black=np.zeros([256,256,3],dtype=np.uint8)
#统计像素 cv.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])
hist = cv.calcHist([bg],[0],None,[256],[0,256])
#print(hist)
#print(hist[241,0]) #[行,列]
#获取直方图的最小值、最大值以及其对应最小值的位置索引和最大值的位置索引 [列,行]
minval,maxval,minloc,maxloc=cv.minMaxLoc(hist)
print(minval,maxval,minloc,maxloc)
#定义直方图的高 这个值用于归一化直方图高度,以适应绘图区域
h_hsit = np.int32(256)
#循环拿像素个数
for i in range(256):
    #绘制直方图
    l=int(hist[i].item()*h_hsit/maxval)#目标值 = 当前值 × 目标最大高度 / 当前最大值
    point1=(i,256-l)
    point2=(i,256)
    cv.line(black,point1,point2,(255,0,0),1)
cv.imshow("hist",black)
cv.waitKey(0)
cv.destroyAllWindows()

 输出:

为什么反过来取行和列?

#print(hist[241,0]) #[行,列]

#获取直方图的最小值、最大值以及其对应最小值的位置索引和最大值的位置索引 [列,行]

使用目标 索引方式 含义
NumPy 数组 array[row, col] 数学上第几行第几列
图像数组 image[y, x] 图像中 y 行 x 列的像素(对应图像坐标)
OpenCV 坐标 (x, y) 图像坐标中,先列再行

 3. 直方图均衡化

3.1全局直方图均衡化

equalized = cv2.equalizeHist(img)
  • 输入图像:8位单通道灰度图像

  • 输出图像:对比度增强后的图像

示例代码:

img = cv2.imread('dark.jpg', 0)
equ = cv2.equalizeHist(img)
cv2.imshow('Original', img)
cv2.imshow('Equalized', equ)
cv2.waitKey(0)

效果说明:

  • 明暗细节得到提升

  • 不适用于彩色图像(需对亮度通道处理)

3.2 自适应直方图均衡化(CLAHE)

3.2.1 基本概念

CLAHE(Contrast Limited Adaptive Histogram Equalization)是对图像划分为小区域(称为“tile”)分别进行直方图均衡化,再进行边缘插值拼接。

相比普通均衡化,CLAHE:

  • 能够增强局部区域对比度

  • 避免全局过度增强带来的噪声放大

  • 可设置对比度限制,避免细节丢失

该方法适用于图像的灰度分布不均匀,且灰度分布集中在更窄的范围,图像的细节不够清晰且对比度较低的情况,然而,传统的直方图均衡化方法会引入噪声,并导致图像中出现过度增强的区域。这是因为直方图均衡化方法没有考虑到图像的局部特征和全局对比度的差异。如下图:

 3.2.2 OpenCV 中的 CLAHE
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))

创建 CLAHE 对象:

  • clipLimit: 对比度限制阈值,通常 2.0~4.0

  • tileGridSize: 每个小区域的网格大小,默认 (8, 8)

应用到图像: 

clahe_img = clahe.apply(gray_img)
3.2.3 案例
import cv2 as cv
#读图
img = cv.imread("D:\OpenCV_notes\day05\images\\zhifang.png",cv.IMREAD_GRAYSCALE)
#直方图均衡化
dst = cv.equalizeHist(img)
cv.imshow("img",img)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()

原图:

均衡化后--dst: 

 

3.3 对比度受限的自适应直方图均衡化

3.3.1 基本概念

很明显,因为全局调整亮度和对比度的原因,脸部太亮,大部分细节都丢失了。自适应均衡化就是用来解决这一问题的:它在每一个小区域内(默认8×8)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域内的对比度进行了限制,所以这个算法全称叫:对比度受限的自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)。

其主要步骤为:

  1. 图像分块(Tiling):图像首先被划分为多个不重叠的小块(tiles)。这样做的目的是因为在全局直方图均衡化中,单一的直方图无法反映图像各个局部区域的差异性。通过局部处理,AHE能够更好地适应图像内部的不同光照和对比度特性。(tiles 的 大小默认是 8x8)

  2. 计算子区域直方图:对于每个小块,独立计算其内部像素的灰度直方图。直方图反映了该区域内像素值的分布情况。

  3. 子区域直方图均衡化:对每个小块的直方图执行直方图均衡化操作。这涉及重新分配像素值,以便在整个小块内更均匀地分布。均衡化过程会增加低频像素的数量,减少高频像素的数量,从而提高整个小块的对比度。

  4. 对比度限制(Contrast Limiting):如果有噪声的话,噪声会被放大。为了防止过大的对比度增强导致噪声放大,出现了限制对比度自适应直方图均衡化(CLAHE)。CLAHE会在直方图均衡化过程中引入一个对比度限制参数。当某一小块的直方图在均衡化后出现极端值时,会对直方图进行平滑处理(使用线性或非线性的钳制函数),确保对比度增强在一个合理的范围内。

  5. 重采样和邻域像素融合:由于小块之间是不重叠的,直接拼接经过均衡化处理的小块会产生明显的边界效应。因此,在CLAHE中通常采用重采样技术来消除这种效应,比如通过双线性插值将相邻小块的均衡化结果进行平滑过渡,使最终图像看起来更为自然和平滑。

  6. 合成输出图像:将所有小块均衡化后的结果整合在一起,得到最终的自适应直方图均衡化后的图像。

 API:

clahe = cv2.createCLAHE(clipLimit=None, tileGridSize=None)
  • clipLimit(可选):对比度限制参数,用于控制直方图均衡化过程中对比度增强的程度。如果设置一个大于1的值(如2.0或4.0),CLAHE会限制对比度增强的最大程度,避免过度放大噪声。如果不设置,OpenCV会使用一个默认值。

  • tileGridSize(可选):图像分块的大小,通常是一个包含两个整数的元组,如(8, 8),表示将图像划分成8x8的小块进行独立的直方图均衡化处理。分块大小的选择会影响到CLAHE的效果以及处理速度。

创建CLAHE对象后,可以使用 .apply() 方法对图像进行CLAHE处理:

img=clahe.apply(image)
  • image:要均衡化的图像。

  • img均衡后的图像

3.3.2 案例
import cv2 as cv
#读图
img = cv.imread("D:\OpenCV_notes\day05\images\\zhifang.png",cv.IMREAD_GRAYSCALE)
#创建clahe对象
clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
dst = clahe.apply(img)
cv.imshow("img",img)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()

原图:

 对比度受限的自适应直方图均衡化后--dst:

二、模板匹配

1. 基本概念

模板匹配是一种在图像中查找与模板图像(小图)最匹配区域的技术。通过滑动模板图像在原图上,并对每个位置计算相似度得分,确定最匹配的位置。

  • 原理:遍历整张图像,将模板图像与图像上相同大小的窗口进行比对,并输出一个匹配结果矩阵(response map)。

  • 目标:找到模板图像在原图中的最佳匹配位置。

2. 典型应用场景

  • 目标检测(如检测人脸、标志、车牌等)

  • 图像识别(如 OCR 中字符定位)

  • 工业检测(产品缺陷检测)

  • 图像对齐、拼接等场景中的参考区域定位

注意事项

  1. 模板图尺寸不能大于原图;

  2. 匹配精度受图像缩放、旋转、亮度影响较大;

  3. 若需增强鲁棒性,可结合图像金字塔、多尺度模板匹配;

  4. 模板匹配适合定位“结构稳定”的图像块,不适合动态场景或大尺度变化目标。

3. 匹配方法(OpenCV 提供 6 种)

使用 OpenCV 函数:

cv2.matchTemplate(image, template, method)

其中 method 参数可选值如下:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值