OpenCV部分操作介绍

文章目录

    • 一、图像尺寸调整与轮廓检测
      • [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()


拉普拉斯金字塔原理:

  • 每一层拉普拉斯图像是高斯金字塔相邻两层的差值
  • 包含了图像的细节信息(边缘、纹理等)
  • 可用于图像的无损重建:原始图像 = 上采样图像 + 拉普拉斯图像

通过这些系统的图像处理技术,我们可以实现从基础的图像操作到高级的特征分析,为计算机视觉应用奠定坚实基础。

相关推荐
轻竹办公PPT2 小时前
2026 年 AI PPT 工具深度复盘:工具间的效率鸿沟与职场应用场景分析
人工智能·python·powerpoint
FJW0208142 小时前
Python装饰器
开发语言·python
Allen_LVyingbo2 小时前
用Python实现辅助病案首页主诊断编码:从数据清洗到模型上线(下)
开发语言·python·安全·搜索引擎·知识图谱·健康医疗
深蓝电商API2 小时前
Selenium无头浏览器配置与反检测技巧
爬虫·python·selenium
0思必得02 小时前
[Web自动化] Selenium浏览器对象方法(操纵浏览器)
前端·python·selenium·自动化·web自动化
叫我:松哥2 小时前
基于Flask的心理健康咨询管理与智能分析,集成AI智能对话咨询、心理测评(PHQ-9抑郁量表/GAD-7焦虑量表)、情绪追踪记录、危机预警识别
大数据·人工智能·python·机器学习·信息可视化·数据分析·flask
徐先生 @_@|||2 小时前
JetBrains 公司的产品策略和技术架构(IDEA(Java)和Pycharm(Python)的编辑器)
java·python·架构
AAD555888992 小时前
光伏组件检测与识别基于RPN_X101-FPN模型实现含Python源码_1
开发语言·python
啊阿狸不会拉杆2 小时前
《机器学习》第五章-集成学习(Bagging/Boosting)
人工智能·算法·机器学习·计算机视觉·集成学习·boosting