OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理

pyrMeanShiftFiltering算法结合了均值迁移(Mean Shift)算法和图像金字塔(Image Pyramid)的概念,用于图像分割和平滑处理。以下是该算法的详细原理:

1.1 、均值迁移(Mean Shift)算法原理

  • 目标:均值迁移算法的目标是找到图像中颜色分布的峰值,这些峰值代表了图像中的不同区域或对象。
  • 特征空间:对于一幅彩色图像,每个像素点可以表示为一个五维向量(x, y, r, g, b),其中(x, y)是像素的位置坐标,(r, g, b)是像素的颜色值。
  • 迭代过程:
  1. 以某个像素点P为圆心,构建一个空间球体(在特征空间中),球体的半径由空间域半径sr和颜色域半径sp决定。
  2. 在这个空间球体内,计算所有点相对于中心点P的色彩向量之和,然后移动中心点P到这个向量的终点,作为新的中心点P1。
  3. 重复上述步骤,直到中心点Pn不再移动,满足迭代终止条件(如达到最大迭代次数或迭代精度)。
  • 结果:经过迭代,收敛到同一点的起始点被归为一类,这些点的像素值被更新为该类中心点的像素值。这样,图像中的相似区域就被平滑处理,同时保留了边缘等差异较大的特征。

1.2 图像金字塔(Image Pyramid)原理

图像金字塔是一种多分辨率图像表示方法,通过将图像在不同尺度下进行下采样,生成一系列分辨率逐渐降低的图像。在pyrMeanShiftFiltering算法中,图像金字塔用于在不同尺度上对图像进行均值迁移滤波,从而增强算法对图像细节的捕捉能力。

2、 pyrMeanShiftFiltering算法实现

函数原型

python 复制代码
dst = cv2.pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]])

参数说明

src(输入图像):

  • 类型:8位、3通道图像。
  • 说明:这是待处理的源图像。

dst(输出图像):

  • 类型:与源图像格式和大小相同的图像。
  • 说明:这是处理后的输出图像。

sp(空间窗口半径):

  • 类型:double。
  • 说明:定义了像素在物理空间中的邻域范围。该值越大,表示考虑的邻域范围越广。

sr(颜色窗口半径):

  • 类型:double。
  • 说明:定义了像素在颜色空间中的邻域范围。该值越大,表示在颜色空间中考虑的相似颜色范围越广。

maxLevel(最大金字塔层级):

  • 类型:int。
  • 默认值:1。
  • 说明:用于控制图像金字塔的层级数。当maxLevel > 0时,会构建高斯金字塔,并在最小层上首先运行均值迁移过程。之后,结果会传播到较大的层,并且仅在金字塔较低分辨率层的颜色与当前层的颜色相差超过sr的像素上再次运行迭代。

termcrit(终止准则):

  • 类型:TermCriteria。
  • 默认值:TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1)。
  • 说明:定义了何时停止均值迁移迭代的条件。可以是迭代次数满足终止条件、迭代目标与中心点偏差满足终止条件,或者两者的结合。

处理过程:

  • 首先,在最高尺度的图像上应用均值迁移滤波。
  • 然后,将滤波后的图像下采样到下一尺度,并重复应用均值迁移滤波。
    这个过程一直持续到达到指定的金字塔层次max_level。
  • 输出:算法输出一张经过平滑处理和分割的图像。在这张图像中,相似颜色的区域被平滑处理,不同区域之间的边缘被保留下来。

效果调试

pyrMeanShiftFiltering算法在图像分割、平滑处理、特征提取等方面有广泛应用。通过调整算法参数(如sp、sr、max_level等),可以获得不同的处理效果。例如,较大的sp和sr值会导致更强烈的平滑效果,而较小的值则能保留更多的图像细节。

3、基于均值漂移的水彩画特效

python 复制代码
import cv2 as cv
import numpy as np

if __name__ == '__main__':
    #读取原始图像
    image = cv.imread('oldman.jpg', cv.IMREAD_COLOR)
    #均值漂移分割
    meanshift = cv.pyrMeanShiftFiltering(image, 16, 64, 2)
    #高斯平滑
    gaussian_filter = cv.GaussianBlur(meanshift, (3, 3), 0.8)
    #中值滤波
    result = cv.medianBlur(gaussian_filter, 3)
    ada_result = np.concatenate((image, result), axis=1)
    cv.imwrite('wash-painting.jpeg', ada_result)
    cv.waitKey()
相关推荐
楚山之石8 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri
Martina_03219 小时前
AI生成的3D白模单帧没问题,镜头一移动就被挡?用6步检查遮挡与构图
图像处理·人工智能·数学建模·3d·ai·自然语言处理·游戏策划
Rattenking18 小时前
OpenCV 轨迹栏操作和键盘响应操作
人工智能·opencv·计算机外设
jay神1 天前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
wangxiaoxuan2172 天前
TF2 的原理与使用:把坐标、运动和观测时间一起算清楚
计算机视觉·机器人·科沃斯八界
硅谷秋水2 天前
EgoHumanoid‑V2 方法分析
人工智能·机器学习·计算机视觉·语言模型·机器人
BYSJMG2 天前
计算机毕业设计选题推荐:【基于深度学习的车辆损坏严重程度评估方法研究】ResNet50 图像分类
人工智能·深度学习·目标检测·机器学习·计算机视觉·分类·课程设计
BYSJMG2 天前
计算机毕业设计选题推荐|【基于深度学习的电梯电动车违规进入检测研究】YOLO26m+可视化大屏
人工智能·深度学习·神经网络·目标检测·机器学习·计算机视觉·课程设计
硅谷秋水3 天前
将闲科技(LiberAI)提出世界动作模型Liber-0
机器学习·计算机视觉·语言模型·机器人
kongdong3 天前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu