Python opencv图像处理基础总结(二) ROI操作与泛洪填充 模糊操作 边缘保留滤波EPF

简介: 模糊操作

一、ROI与泛洪填充


1. ROI操作


ROI(Region Of Interest),感兴趣区域,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,经常用来连接图像。

importcv2ascvsrc=cv.imread(r'./test/004.jpg')
cv.imshow('src', src)
# 获取RIO区域sample=src[30:390, 80:400]
# 变为灰度图像gray=cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
# 还原回RGB三通道的back_sample=cv.cvtColor(gray, cv.COLOR_GRAY2BGR)
# 变回去src[30:390, 80:400] =back_samplecv.imshow('sample', src)
cv.waitKey(0)


运行效果如下:

opencv1.png



2. 彩色图像和二值图像的泛洪填充


泛洪填充:将指定颜色从指定位置开始填充一个连通区域,此时的连通性由像素值的接近程度来衡量。


importcv2ascvimportnumpyasnp# 彩色图像deffill_color(image):
copy_image=image.copy()
height, width=image.shape[:2]
# 造一个mask   单通道的   np.uint8mask=np.zeros([height+2, width+2], np.uint8)
# 泛洪填充 floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)cv.floodFill(copy_image, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow('fill_color', copy_image)
src=cv.imread(r'./test/010.png')
fill_color(src)
cv.imshow('src', src)
cv.waitKey(0)


运行效果如下:

opencv2.png

importcv2ascvimportnumpyasnp# 二值图像deffill_binary():
# 造一个二值图像image=np.zeros([400, 400, 3], np.uint8)
image[100:300, 100:300, :] =255cv.imshow('binary_image', image)
height, width=image.shape[:2]
print(height, width)
# 造maskmask=np.ones([height+2, width+2], np.uint8)
mask[101:301, 101:301] =0# 泛洪填充cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
cv.imshow('filled binary', image)
fill_binary()
cv.waitKey(0)


运行效果如下:

opencv3.png


opencv里的 mask 为 uin8 类型的单通道阵列

泛洪填充算法也叫漫水填充算法:floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)


  • image参数表示输入/输出 1 或 3 通道,8位或浮点图像。
  • mask参数表示掩码,该掩码是单通道 8 位图像,比 image 的高度多 2 个像素,宽度多 2 个像素,填充时不能穿过输入掩码中的非零像素。
  • seedPoint参数表示泛洪算法的起始点
  • newVal参数表示在重绘区域像素的新值
  • loDiff参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之负差的最大值
  • upDiff参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之正差的最大值

opencv4.png

个人理解是,参数 seedPoint 起始点的像素值减去参数 loDiff 的像素值表示的是从起始点开始搜索周边范围的像素最低值,参数 seedPoint 起始点的像素值加上参数 upDiff 的像素值表示的是从起始点开始搜索周边范围的像素最大值。有了这个范围,然后该函数就可以在这个连续像素范围内填充指定的颜色 newVal 参数值。


二、模糊操作

模糊操作的基本原理:


  • 基于离散卷积,定义好每个卷积核。
  • 不同卷积核得到不同的卷积效果,模糊是卷积的一种表象。


1. 均值模糊


对随机噪声有很好的去噪效果!


importcv2ascv# 均值模糊  卷积原理  C++积分图运算  速度非常快# cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)# 对随机噪声有很好的去噪效果defmean_ambiguity(image):
# 水平方向dst1=cv.blur(image, (20, 1))
# 垂直方向dst2=cv.blur(image, (1, 20))
dst3=cv.blur(image, (10, 10))
cv.imshow('dst1', dst1)
cv.imshow('dst2', dst2)
cv.imshow('dst3', dst3)
src=cv.imread(r'.\test\004.jpg')
# 缩小图片尺寸  便于展示src=cv.resize(src, None, fx=0.5, fy=0.5)
mean_ambiguity(src)
cv.imshow('src', src)
cv.waitKey(0)


运行效果如下:

opencv5.png


2. 中值模糊


对椒盐噪声有很好的去噪效果!


importcv2ascv# cv2.medianBlur(src, ksize, dst=None)defmedian_ambiguity(image):
# 中值模糊    对椒盐噪声有很好的去噪效果dst=cv.medianBlur(image, 5)
cv.imshow('dst', dst)
src=cv.imread(r'.\test\012.png')
cv.imshow('src', src)
median_ambiguity(src)
cv.waitKey(0)


运行效果如下:

opencv6.png


3. 自定义模糊


自定义卷积核


importcv2ascvimportnumpyasnpdefcustom_blur_demo(image):
# 自定义filterkernel=np.ones([8, 8], np.float32) /64dst=cv.filter2D(image, ddepth=-1, kernel=kernel)
cv.imshow('custom_blur_demo', dst)
src=cv.imread(r'.\test\012.png')
cv.imshow('src', src)
custom_blur_demo(src)
cv.waitKey(0)


运行效果如下:

opencv7.png

自定义filter,卷积还可实现锐化 ,锐化算子定义要符合原则,能增强图像,更有立体感!


////

importcv2ascvimportnumpyasnpdefcustom_blur_demo(image):
# 自定义filter  卷积还可实现锐化  锐化算子 定义要符合原则  增强图像  更有立体感kernel=np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst=cv.filter2D(image, ddepth=-1, kernel=kernel)
cv.imshow('custom_blur_demo', dst)
src=cv.imread(r'.\test\010.png')
cv.imshow('src', src)
custom_blur_demo(src)
cv.waitKey(0)


运行效果如下:

opencv8.png


三、高斯模糊


高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和,原理并不复杂。利用高斯分布权值矩阵与原始图像矩阵做卷积运算,由于高斯分布的傅里叶变换仍然是高斯分布,使用高斯模糊就减少了图像的高频分量,因此高斯模糊是低通滤波器,数学上讲,对图像做高斯模糊等相当于将图像与高斯函数卷积。至于高斯分布权重矩阵,就是对二维正态分布的密度函数(也就是高斯函数)采样再做归一化的产物。


使用 python 与 opencv 实现高斯模糊,只需调用 GaussianBlur 函数,给出高斯矩阵的尺寸和标准差就可以。


cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)


////

importcv2ascvimportnumpyasnpdefclamp(pv):
ifpv>255:
return255elifpv<0:
return0else:
returnpv# 加上高斯噪声defgaussion_noise(image):
h, w, c=image.shape# 解构forrowinrange(h):
forcolinrange(w):
# np.random.normal(loc=0.0, scale=1.0, size=None)# 产生正态分布的随机数# loc:float 此概率分布的均值 scale:float 此概率分布的标准差# size:int or tuple of ints 输出的shape,默认为None,只输出一个值s=np.random.normal(loc=1.0, scale=9.0, size=3)
b=image[row, col, 0]   # blueg=image[row, col, 1]   # greenr=image[row, col, 2]   # red# 加上随机数后  有些像素点可能会超界image[row, col, 0] =clamp(b+s[0])
image[row, col, 1] =clamp(g+s[1])
image[row, col, 2] =clamp(r+s[2])
cv.imshow('Gaussian noise', image)
returnimagesrc=cv.imread(r'./test/004.jpg')
src=cv.resize(src, None, fx=0.5, fy=0.5)
cv.imshow('src', src)
# 高斯模糊  保留像素的主要特征# 高斯模糊对这种高斯噪声  抑制效果好dst=cv.GaussianBlur(gaussion_noise(src), (5, 5), 0)
cv.imshow('Gaussian blur', dst)
t1=cv.getTickCount()
gaussion_noise(src)
t2=cv.getTickCount()
time= (t2-t1) /cv.getTickFrequency()
print(f'用时:{time}s')
cv.waitKey(0)


运行效果如下:

opencv9.png



四、边缘保留滤波EPF


1. 高斯双边滤波


前面所用的高斯模糊只考虑了像素空间的分布,而没有考虑差异问题。高斯滤波在滤波时会将图像中各个颜色区域的边缘同区域本身一同模糊掉,而高斯双边滤波则是对各个区域的交界边缘有所保留


python与 opencv 实现高斯双边滤波,调用 bilateralFilter 这个API。


cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
-src:输入图像。-d:在过滤期间使用的每个像素邻域的直径。如果输入d非0,则sigmaSpace由d计算得出,如果sigmaColor没输入,则sigmaColor由sigmaSpace计算得出。-sigmaColor:色彩空间的标准方差,一般尽可能大。较大的参数值意味着像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色。--sigmaSpace::坐标空间的标准方差(像素单位),一般尽可能小。参数值越大意味着只要它们的颜色足够接近,越远的像素都会相互影响。当d>0时,它指定邻域大小而不考虑sigmaSpace。否则,d与sigmaSpace成正比。


importcv2ascvdefbi_filter(image):
# 高斯双边滤波dst=cv.bilateralFilter(image, d=0, sigmaColor=100, sigmaSpace=15)
cv.imshow('bi_filter', dst)
src=cv.imread(r'./test/009.png')
cv.imshow('src', src)
bi_filter(src)
cv.waitKey(0)

运行效果如下:

opencv10.png


可以非常清楚地看见图像中的脸上的水大部分被滤掉了,皮肤的效果最为明显,就像换了一张皮,并且脸的轮廓都被保留了下来,而没有像均值模糊、中值模糊或者高斯模糊那样得到的图像有些模糊。


2. 均值迁移滤波


均值迁移模糊是图像边缘保留滤波算法中的一种,经常用在对图像进行分水岭分割之前去噪声,可以大幅度提升分水岭分割的效果。均值迁移模糊的主要思想如下: 就是在图像进行开窗的时候,考虑像素值空间范围分布,只有符合分布的像素点才参与计算,计算得到像素均值与空间位置均值,使用新的均值位置作为窗口中心位置继续基于给定像素值空间分布计算均值与均值位置,如此不断迁移中心位置直到不再变化位置(dx=dy=0),但是在实际情况中我们会人为设置一个停止条件比如迁移几次,这样就可以把最后的RGB均值赋值给中心位置。


在n维空间中,有一定数量的样本,我们选定其中的一个样本,以该样本为中心,给长度为半径画一个圆,求取该圆形区域内样本的质心,即密度最大的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。


python与 opencv 实现均值迁移滤波,调用 pyrMeanShiftFiltering 这个API。


cv2.pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None)
-src:输入图像-sp:定义迁移物理空间的半径大小-sr:定义迁移色彩空间的半径大小-maxLeval:表示金字塔的最大层数-termcrit:表示漂移迭代终止条件以上参数中最后两个很少用到,主要是sp和sr两个参数,二者设置的值越大,对图像色彩的平滑效果越明显,同时函数耗时越多。


importcv2ascvdefpyr_meanshift_filter(image):
# 均值偏移dst=cv.pyrMeanShiftFiltering(image, sp=15, sr=60)
cv.imshow('pyMS', dst)
src=cv.imread(r'./test/009.png')
cv.imshow('src', src)
pyr_meanshift_filter(src)
cv.waitKey(0)


运行效果如下:

opencv11.png



与高斯双边滤波的效果比较来看,均值迁移模糊的效果给人一种磨皮过度的感觉,滤波后的图像就像油画那样。

目录
相关文章
|
10月前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
416 20
|
6月前
|
人工智能 算法 计算机视觉
Python 图像处理技巧
本文介绍了Python图像处理中需要掌握的15个基本技能,涵盖图像读取与保存、颜色空间转换、裁剪与调整大小、滤波与平滑、边缘检测、阈值处理、形态学操作、直方图处理、特征检测与描述、图像配准与特征匹配、轮廓检测与分析、图像分割、模板匹配、透视变换与仿射变换以及傅里叶变换等内容。通过OpenCV、Pillow和Matplotlib等库实现相关功能,为图像处理提供了全面的基础指导。
209 0
|
9月前
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
474 1
|
10月前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
478 10
|
10月前
|
机器学习/深度学习 算法 数据可视化
Python的计算机视觉与图像处理
本文介绍了Python在计算机视觉和图像处理领域的应用,涵盖核心概念、算法原理、最佳实践及应用场景。重点讲解了OpenCV、NumPy、Pillow和Matplotlib等工具的使用,并通过代码实例展示了图像读写、处理和可视化的方法。实际应用包括自动驾驶、人脸识别、物体检测等。未来趋势涉及深度学习、边缘计算和量子计算,同时也讨论了数据不足、模型解释性和计算资源等挑战。
529 2
|
计算机视觉 开发者 Python
利用Python进行简单的图像处理
【10月更文挑战第36天】本文将引导读者理解如何使用Python编程语言和其强大的库,如PIL和OpenCV,进行图像处理。我们将从基本的图像操作开始,然后逐步深入到更复杂的技术,如滤波器和边缘检测。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和技能,让你能够更好地理解和操作图像数据。
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
390 7
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
计算机视觉 开发者 Python
使用Python进行简单图像处理
【8月更文挑战第31天】 本文将介绍如何使用Python编程语言来处理图像。我们将通过代码示例来展示如何读取、显示、编辑和保存图像文件。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供一个清晰的指引,帮助你开始自己的图像处理项目。
|
算法 数据可视化 计算机视觉
Python中医学图像处理常用的库
在Python中,医学图像处理常用的库包括:ITK(及其简化版SimpleITK)、3D Slicer、Pydicom、Nibabel、MedPy、OpenCV、Pillow和Scikit-Image。这些库分别擅长图像分割、配准、处理DICOM和NIfTI格式文件、图像增强及基础图像处理等任务。选择合适的库需根据具体需求和项目要求。
533 0

推荐镜像

更多