Python-初学openCV——图像预处理(六)

发布于:2025-08-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

目录

一、凸包特征检测

1、穷举法

2、QuickHull法

3、获取凸包

4、绘制凸包

 二、图像轮廓特征查找

1、外接矩阵

2、最小外接矩形

3、最小外接圆

三、直方图均衡化

1、概念

2、绘制直方图

3、直方图均衡化

3.1 自适应直方图均衡化

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


一、凸包特征检测

凸包其实就是将一张图片中物体的最外层的点连接起来构成的凸多边形,它能包含物体中所有的内容。凸包检测常用在物体识别、手势识别、边界检测等领域

        1、穷举法

        将集中的点进行两两配对,并进行连线,对于每条直线,检查其余所有的点是否处于该直线的同一侧,如果是,那么说明构成该直线的两个点就是凸包点,其余的线依次进行计算,从而获取所有的凸包点。

穷举法就是“把所有可能都试一遍”。优点:简单、不会漏解;缺点:效率低,不适合大规模问题

        2、QuickHull法

        将所有点放在二维坐标系中,找到横坐标最小和最大的两个点P_1和P_2并连线。此时整个点集被分为两部分,直线上为上包,直线下为下包,以上保暖为例,找到上包中的点距离该直线最远的点P_3,连线并寻找直线P1P3左侧的点和P2P3右侧的点,然后重复本步骤,直到找不到为止。对下包也是这样操作

        3、获取凸包

cv2.convexHull(points)

points:输入参数,图像的轮廓

        4、绘制凸包

cv2.polylines(image, pts, isClosed, color, thickness=1)

image:要绘制线条的目标图像

pts:一个二维 numpy 数组,每个元素是一维数组,代表一个多边形的一系列顶点坐标

isClosed:布尔值,表示是否闭合多边形,如果为 True,会在最后一个顶点和第一个顶点间自动添加                    一条线段,形成封闭的多边形

color:线条颜色,可以是一个三元组或四元组,分别对应BGR或BGRA通道的颜色值,或者是灰                度图像的一个整数值

thickness:线条宽度,默认值为1(可选)

 二、图像轮廓特征查找

        图像轮廓特征查找其实就是他的外接轮廓。应用:图像分割、形状分析、物体检测与识别

        根据轮廓点进行,所以要先找到轮廓。先灰度化、二值化。目标物体白色,非目标物体黑色,选择合适的儿值化方式。有了轮廓点就可以找到最上、最下、最左、最右的四个坐标,就可以绘制出矩形

        1、外接矩阵

boundingRect(轮廓点)

 外接矩阵不考虑旋转并且能包含整个轮廓的矩形,外接矩形可根据获得到的轮廓坐标中最上、最下、最左、最右的点的坐标来绘制外接矩形

cv2.rectangle(img, pt1, pt2, color, thickness)

 pt1:矩形左上角的坐标;        pt2:矩形右下角的坐标

color:线条颜色;                     thickness:线条粗细(-1 填充)

(cv2.LINE_AA:线条类型,cv2.LINE_8(默认)、cv2.LINE_AA(抗锯齿))

        2、最小外接矩形

        寻找最小外接矩形使用的算法叫做旋转卡壳法

rect = cv2.minAreaRect(cnt)

cnt: 是contours中的轮廓,可以通过遍历contours计算出每个轮廓的小面积外接矩形

cv2.boxPoints(rect).astype(int)

返回 是一个形状为 4行2列的数组,每一行代表一个点的坐标(x, y),顺序按照逆时针或顺时针方向排列。将最小外接矩形转换为边界框的四个角点,并转换为整数坐标

cv2.drawContours(image, contours, contourIdx, color, thickness)

image:原图像

contours:一个包含多个轮廓的列表

contourIdx:要绘制的轮廓索引。如果设置为 -1,则绘制所有轮廓

        3、最小外接圆

        寻找最小外接圆使用的算法是Welzl算法

center,radius = cv2.minEnclosingCircle(points)

points:输入参数图片轮廓数据

center:一个包含圆心坐标的二元组(x,y)

radius:浮点类型,最小覆盖圆的半径

三、直方图均衡化

        1、概念

        直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征

        直方图:反映图像像素分布的统计图,横坐标就是图像像素的取值,纵坐标是该像素的个数。也就是对一张图像中不同像素值的像素个数的统计

        2、绘制直方图

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

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

images: 输入图像列表,可以是一幅或多幅图像

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

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

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

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

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

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

cv2.line(img, pt1, pt2, color, thickness)

img:原始图像

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

        3、直方图均衡化

        一副效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度,通俗的讲,就是遍历图像的像素统计出灰度值的个数、比例与累计比例,并重新映射到0-255范围(也可以是其他范围)内

                3.1 自适应直方图均衡化

        自适应直方图均衡化(Adaptive Histogram Equalization, AHE),通过调整图像像素值的分布,使得图像的对比度和亮度得到改善

dst = cv.equalizeHist(imgGray)

imgGray为需要直方图均衡化的灰度图,返回值为处理后的图像  

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

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

步骤:

图像分块:图像被划分为多个不重叠的小块通过局部处理,AHE能够更好地适应图像内部的不同光照和对比度特性

计算子区域直方图:对于每个小块,独立计算其内部像素的灰度直方图

子区域直方图均衡化:均衡化过程会增加低频像素的数量,减少高频像素的数量,从而提高整个小块的对比度

对比度限制:CLAHE会在直方图均衡化过程中引入一个对比度限制参数。当某一小块的直方图在均衡化后出现极端值时,会对直方图进行平滑处理,确保对比度增强在一个合理的范围内

重采样和邻域像素融合:通常采用重采样技术来消除直接拼接经过均衡化处理的小块会产生明显的边界效应

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

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:需要均衡化的图像 


    网站公告

    今日签到

    点亮在社区的每一天
    去签到