文章目录
-
- 一、图像尺寸调整与轮廓检测
-
- [1.1 图像尺寸调整基础](#1.1 图像尺寸调整基础)
- [1.2 轮廓检测实战](#1.2 轮廓检测实战)
- 二、直方图处理技术
-
- [2.1 直方图基础与计算](#2.1 直方图基础与计算)
- [2.2 彩色图像直方图分析](#2.2 彩色图像直方图分析)
- [2.3 掩膜(Mask)的应用](#2.3 掩膜(Mask)的应用)
- [2.4 直方图均衡化](#2.4 直方图均衡化)
- 三、图像金字塔技术
-
- [3.1 高斯金字塔](#3.1 高斯金字塔)
- [3.2 拉普拉斯金字塔](#3.2 拉普拉斯金字塔)
一、图像尺寸调整与轮廓检测
1.1 图像尺寸调整基础
在图像处理中,经常需要对图像进行缩放操作。OpenCV提供了灵活的尺寸调整功能:
python
import numpy as np
import cv2
# 绘图展示函数
def cv_show(name, image):
cv2.imshow(name, image)
cv2.waitKey(0)
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
dim = None
(h, w) = image.shape[:2] # 获取原始图像的高度和宽度
if width is None and height is None:
return image
if width is None:
# 仅指定高度,按比例计算宽度
r = height / float(h)
dim = (int(w * r), height)
else:
# 仅指定宽度,按比例计算高度
r = width / float(w)
dim = (width, int(h * r))
# 执行实际的缩放操作
resized = cv2.resize(image, dim, interpolation=inter)
return resized
方法参数详解:
image:输入的原始图像width:目标宽度(可选)height:目标高度(可选)inter:插值方法,默认为cv2.INTER_AREA(面积插值)cv2.INTER_AREA:适用于图像缩小,能保持较好的视觉效果cv2.INTER_LINEAR:双线性插值,适用于图像放大cv2.INTER_CUBIC:三次插值,质量更高但速度较慢
1.2 轮廓检测实战
轮廓检测是图像分析的重要环节,用于识别物体的边界:
python
# 读取输入图像
image = cv2.imread('fapiao.jpg')
cv_show('image', image)
# 图片过大,进行缩小处理
ratio = image.shape[0] / 500.0 # 计算缩小比率
orig = image.copy()
image = resize(orig, height=500)
cv_show('1', image)
# 轮廓检测
print("STEP 1:轮廓检测")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图
# 自动阈值二值化
edged = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# 查找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[-2]
# 绘制所有轮廓
image_contours = cv2.drawContours(image.copy(), cnts, -1, (0, 0, 255), 1)
cv_show('image_contours', image_contours)
# 获取最大轮廓
print("STEP 2:获取最大轮廓")
# 按面积排序,获取最大轮廓
screenCnt = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
print(screenCnt.shape)
# 计算轮廓周长
peri = cv2.arcLength(screenCnt, True)
# 轮廓近似,简化轮廓点
screenCnt = cv2.approxPolyDP(screenCnt, 0.05 * peri, True)
print(screenCnt.shape)
# 绘制近似后的轮廓
image_contour = cv2.drawContours(image.copy(), [screenCnt], -1, (0, 255, 0), 2)
cv2.imshow('image_contour', image_contour)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键函数解析:
cv2.findContours():查找图像中的轮廓RETR_LIST:检测所有轮廓,不建立层次关系CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留端点
cv2.arcLength():计算轮廓周长cv2.approxPolyDP():轮廓多边形近似,用于简化轮廓
二、直方图处理技术
2.1 直方图基础与计算
直方图是图像处理中分析像素分布的重要工具:
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取灰度图像
pic = cv2.imread('picture_1.jpg', cv2.IMREAD_GRAYSCALE)
# 将图像转换为一维数组
a = pic.ravel()
# 绘制直方图
plt.hist(a, bins=256)
plt.show()
# 使用OpenCV计算直方图
pic_hist = cv2.calcHist([pic], [0], None, [16], [0, 256])
plt.plot(pic_hist) # 使用calcHist的值绘制曲线图
plt.show()
cv2.calcHist()参数详解:
images:输入图像列表,用方括号括起来channels:要统计的通道索引,灰度图为[0],彩色图可为[0],[1],[2](对应B,G,R)mask:掩膜图像,指定统计区域,None表示统计整幅图像histSize:直方图的区间数(BINS数量)ranges:像素值范围,通常为[0,256]
2.2 彩色图像直方图分析
python
img = cv2.imread('picture_1.jpg')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
histr = cv2.calcHist([img], [i], None, [256], [0, 256])
plt.plot(histr, color=col)
plt.show()
2.3 掩膜(Mask)的应用
掩膜用于限制图像处理操作的区域:
python
pic = cv2.imread('picture_1.jpg', cv2.IMREAD_GRAYSCALE)
pic = cv2.resize(img, None, fx=0.4, fy=0.4)
cv2.imshow('pic', pic)
cv2.waitKey(0)
# 创建掩膜
mask = np.zeros(pic.shape[:2], np.uint8) # 创建全黑图像
mask[50:350, 100:470] = 255 # 设置感兴趣区域为白色
cv2.imshow('mask', mask)
cv2.waitKey(0)
# 应用掩膜
Pic_mask = cv2.bitwise_and(pic, pic, mask=mask)
cv2.imshow('pic_mask', Pic_mask)
cv2.waitKey(0)
# 计算掩膜区域的直方图
pic_list_mask = cv2.calcHist([pic], [0], mask, [256], [0, 256])
plt.plot(pic_list_mask)
plt.show()

cv2.bitwise_and()函数:
- 对两个图像进行按位与操作
mask参数:指定操作的有效区域,mask为0的位置结果也为0
2.4 直方图均衡化
直方图均衡化通过重新分布像素值来增强图像对比度:
python
black = cv2.imread('black.jpg', cv2.IMREAD_GRAYSCALE)
plt.hist(black.ravel(), bins=256)
plt.show()
# 全局直方图均衡化
black_equalize = cv2.equalizeHist(black)
plt.hist(black_equalize.ravel(), bins=256)
plt.show()
# 对比显示
res = np.hstack((black, black_equalize))
cv2.imshow('black_equalize', res)
cv2.waitKey(0)
# 自适应直方图均衡化(局部处理)
clae = cv2.createCLAHE(clipLimit=10, tileGridSize=(8, 8))
black_clae = clae.apply(black)
res = np.hstack((black, black_equalize, black_clae))
cv2.imshow('black_equalize', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

自适应直方图均衡化参数:
clipLimit:对比度限制阈值,防止局部对比度过高tileGridSize:局部处理的窗口大小
三、图像金字塔技术
3.1 高斯金字塔
高斯金字塔用于图像的多尺度分析:
python
import cv2
pic = cv2.imread(r'picture_1.jpg', cv2.IMREAD_GRAYSCALE)
pic = cv2.resize(pic, (640, 640))
cv2.imshow('picture_1.jpg', pic)
cv2.waitKey(0)
# 向下采样(缩小)
pic_down_1 = cv2.pyrDown(pic) # G1层
cv2.imshow('down_1', pic_down_1)
cv2.waitKey(0)
pic_down_2 = cv2.pyrDown(pic_down_1) # G2层
cv2.imshow('down_2', pic_down_2)
cv2.waitKey(0)
# 向上采样(放大)
pic_up_1 = cv2.pyrUp(pic) # G1'层
cv2.imshow('up_1', pic_up_1)
cv2.waitKey(0)
pic_up_2 = cv2.pyrUp(pic_up_1) # G2'层
cv2.imshow('up_2', pic_up_2)
cv2.waitKey(0)
# 下采样后再上采样的效果
pic_down_1_up = cv2.pyrUp(pic_down_1)
pic_down_2_up = cv2.pyrUp(pic_down_2)
cv2.imshow('down_1_up', pic_down_1_up)
cv2.imshow('down_2_up', pic_down_2_up)
cv2.waitKey(0)
3.2 拉普拉斯金字塔
拉普拉斯金字塔用于图像重建和边缘检测:
python
# 统一调整到目标尺寸
target_shape = (640, 640)
pic_down_1_resized = cv2.resize(pic_down_1, target_shape)
pic_down_2_up_resized = cv2.resize(pic_down_2_up, target_shape)
# 计算拉普拉斯金字塔层
L1 = pic_down_1_resized - pic_down_2_up_resized
L0 = pic - pic_down_1_up
# 图像重建
fuyuan = pic_down_1_up + L0
cv2.imshow('L0', L0)
cv2.imshow('L1', L1)
cv2.waitKey(0)
cv2.imshow('fuyuan', fuyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()

拉普拉斯金字塔原理:
- 每一层拉普拉斯图像是高斯金字塔相邻两层的差值
- 包含了图像的细节信息(边缘、纹理等)
- 可用于图像的无损重建:原始图像 = 上采样图像 + 拉普拉斯图像
通过这些系统的图像处理技术,我们可以实现从基础的图像操作到高级的特征分析,为计算机视觉应用奠定坚实基础。