网站科技动效,搭建网站知识,重庆低价网站建设,做坏事网站图像预处理是计算机视觉任务中的关键步骤#xff0c;它通过对原始图像进行处理#xff0c;以提高后续图像分析、特征提取和识别的准确性。 示例图片
目录
常见图像处理方法
灰度化处理
法一 法二 说明
切片截取部分图像数据
cv2.cvtColor() 颜色空间转换
cv2.split(… 图像预处理是计算机视觉任务中的关键步骤它通过对原始图像进行处理以提高后续图像分析、特征提取和识别的准确性。 示例图片
目录
常见图像处理方法
灰度化处理
法一 法二 说明
切片截取部分图像数据
cv2.cvtColor() 颜色空间转换
cv2.split():颜色通道提取 cv2.resize():修改图像尺寸 cv2.addWeighted()图像融合
cv2.merge()图像合并
cv2.copyMakeBorder()边界填充 cv2.threshold()全局阈值法图像二值化
cv2.adaptiveThreshold()自适应阈值法图像二值化
图像形态学基本操作
cv2.morphologyEx()函数简介 cv2.erode()腐蚀操作 腐蚀原理 cv2.dilate() 膨胀操作 膨胀原理
cv2.morphologyEx()实现开闭运算
开运算原理
闭运算原理
代码
图像几何变化操作
图像直方图修正操作
图像空域滤波操作 常见图像处理方法 灰度化处理
法一
#灰度化处理
#法1直接读取灰度图
import cv2
gray_imagecv2.imread(test.jpg,cv2.IMREAD_GRAYSCALE)
cv2.imshow(gray_image,gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果 法二
#灰度化处理
#法2读取时不指定 flags默认 cv2.IMREAD_COLOR然后使用 cv2.cvtColor 转换为灰度图
import cv2
imagecv2.imread(test.jpg,cv2.IMREAD_UNCHANGED)
grayt_imagecv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow(gray_image,gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果 说明 两种方法都可对彩色图像进行灰度化处理法一是在读取图像的同时将其转换为灰度图像。法二则是先读取彩色图像再进行颜色空间转换。法一相对于法二更加节省内存因为法一在图像处理的读取时就进行了灰度化处理避免了彩色图像占用的大量内存空间。 这两种处理方法的结果是一致的 切片截取部分图像数据 读取后的图像是(高,宽,通道数)的ndarray结构,若我们对图像的某一部分感兴趣,那我们只需要在高和宽对应的数组上进行切片即可获取到图像的部分数据。
#截取部分图像数据
import cv2
imagecv2.imread(test.jpg,cv2.IMREAD_UNCHANGED)
cv2.imshow(image,image[100:500,0:300])
cv2.waitKey(0)
cv2.destroyAllWindows() 原图像的尺寸为500x500,这里我们对其进行切片截取。截取区域为高[100:500]x宽[0:300]。 cv2.cvtColor() 颜色空间转换 cv2.cvtColor()是OpenCV库中一个非常实用的函数它能够将图像从一个颜色空间转换到另一个颜色空间。这种转换在图像处理中非常有用因为不同的颜色空间对于特定的图像处理任务可能具有不同的优势。例如在边缘检测中灰度图像往往比彩色图像更有效。
#cv2.cvtColor()颜色空间转化
import cv2
imagecv2.imread(test.jpg)
imagecv2.cvtColor(srcimage,codecv2.COLOR_BGR2HSV)
#常用的颜色转化code
#BGR-Gray cv2.COLOR_BGR2GRAY
#BGR-HSV cv2.COLOR_BGR2HSV
#BGR-RGB cv2.COLOR_BGR2RGB
#BGR-CMYK cv2.COLOR_BGR2CMYK#RGB-BGR cv2.COLOR_RGB2BGR
#RGB-HSV cv2.COLOR_RGB2HSV
#RGB-GRAY cv2.COLOR_RGB2GRAY#HSV-BGR cv2.COLOR_HSV2BGR
#HSV-RGB cv2.COLOR_HSV2RGB#GRAY-BGR cv2.COLOR_GRAY2BGR
#GRAY-RGB cv2.COLOR_GRAY2RGB
cv2.imshow(image,image)
cv2.waitKey(0)
cv2.destroyAllWindows() 我们常用的一些颜色空间有BGR,RGB,HSV,CMYK,GRAY这几种,在使用cv2.cvtColor()函数进行变换时,我们只需要按照cv2.COLOR_原颜色空间2新颜色空间的格式(2表示to)传入给code便可将图像从一种颜色空间转换到另一种。 将图像由BGR颜色空间变换到HSV空间后 cv2.split():颜色通道提取 颜色通道提取是图像处理中的一个基本且重要的步骤它涉及到从图像中分离出红色、绿色、蓝色或其他颜色通道的信息。由于读取得到的图像结果是ndarray,因此我们既可以使用cv2内置函数split分离颜色通道,又可以使用切片的方式来获取三个颜色通道的信息。
import cv2
imagecv2.imread(test.jpg,cv2.IMREAD_UNCHANGED)
b,g,rcv2.split(image)直接使用cv2.split()函数对图像的3个颜色通道数据进行提取
import cv2
imagecv2.imread(test.jpg,cv2.IMREAD_UNCHANGED)
b,g,rimage[:,:,0],image[:,:,1],image[:,:,2]通过切片的方法对图像的3个颜色通道数据进行提取
二者得到的结果是一致的。 当然,如果我们只想保留图像在某个颜色通道上的数据,只需将该通道以外的所有数据置0即可。
import cv2
imagecv2.imread(test.jpg)
#将图像数据copy一份给blue_image,
#这样不会影响到后续可能要对原图像进行的操作
blue_imageimage.copy()
blue_image[:,:,1]blue_image[:,:,2]0
cv2.imshow(blue_image,blue_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果 cv2.resize():修改图像尺寸 cv2的内置函数resize可以方便地调整图像的大小,值得注意的是在修改图像尺寸时,为了尽量避免对图像质量造成过多的损失可以通过选择适当的插值算法来保持图像的清晰度和细节。对此cv2.resize函数的默认方法为 放大时cv2.INTER_CUBIC(双三次插值) 缩小时cv2.INTER_AREA(区域插值)
import cv2
import matplotlib.pyplot as plt
#plt.imshow的图像格式为RGB,因此读取图像数据时我们指定flags按照RGB格式
imagecv2.imread(test.jpg,cv2.IMREAD_COLOR_RGB)#原始图像大小为500x500
#resize函数参数:
imagecv2.resize(srcimage, dsize(600, 600),fx2, fy2, interpolationcv2.INTER_CUBIC)
#src:原图像ndarray
#dsize元祖形式指定图像的高和宽
#fx:x轴上图像放大或缩小倍数
#fy:y轴上图像放大或缩小倍数
#interploation:图像插值方法
#需要注意的是当dsize为(0,0)或不存在时,fx,fy才会起作用,也就是说resize函数优先使用dsize#常用的interploation参数
#cv2.INTER_NEAREST:最近邻插值(速度快,但可能导致锯齿)
#cv2.INTER_LINEAR:双线性插值(默认,适用于大多数情况)
#cv2.INTER_CUBIC:双三次插值(高质量,计算成本较高
#cv2.INTER_AREA:区域插值(缩小图像时效果较好)
#cv2.INTER_LANCZOS4:Lanczos插值(高质量,适用于放大)
plt.imshow(image)
cv2.resize()函数参数详解: src原图像ndarray dsize元祖形式指定调整后图像的高和宽fxx轴上图像放大或缩小倍数fyy轴上图像放大或缩小倍数 interploation图像插值方法 需要注意的是当dsize为(0,0)或不存在时,fx,fy才会起作用,也就是说resize函数优先使用dsize resize后的图像,原图像尺寸500x500,dsize(0,0),按照fx,fy取值对图像大小进行调整 cv2.addWeighted()图像融合 在某些场景下我们需要对两张图片进行融合,考虑到图像经过cv2.imread()函数读取后均为ndarray,因此我们可以直接对两张图片的读取结果进行加减乘除运算,一般而言,图像进行融合时我们都采用线性融合的方式比如我们可以直接将二者简单相加
#图像融合直接相加
import cv2
import matplotlib.pyplot as plt
plt.rcParams[font.sans-serif][SimHei]
image1cv2.imread(test.jpg,cv2.IMREAD_COLOR_RGB)
image2cv2.imread(test1.jpg,cv2.IMREAD_COLOR_RGB)
image1cv2.resize(image1,(800,800))
image2cv2.resize(image2,(800,800))
newimageimage1image2
print(image1[:3,:,0],\n)
print(image2[:3,:,0],\n)
print(newimage[:3,:,0])
plt.subplot(1,3,1),plt.imshow(image1),plt.title(图像1)
plt.subplot(1,3,2),plt.imshow(image2),plt.title(图像2)
plt.subplot(1,3,3),plt.imshow(newimage),plt.title(图像1图像2) 将两个图像直接相加 结果 当然,cv2还提供了addWeighted方法实现上述效果:
#图像融合,使用cv2.addWeighted函数
import cv2
plt.rcParams[font.sans-serif][SimHei]
image1cv2.imread(test.jpg,cv2.IMREAD_COLOR_RGB)
image2cv2.imread(test1.jpg,cv2.IMREAD_COLOR_RGB)
image1cv2.resize(image1,(800,800))
image2cv2.resize(image2,(800,800))
newimagecv2.addWeighted(src1image1,alpha0.6,src2image2,beta0.8,gamma5)
#src1:图像1
#alpha:图像1系数
#src2:图像2
#beta:图像2系数
#gamma;常数项
#newimage0.5*image10.8*image25
plt.subplot(1,3,1),plt.imshow(image1),plt.title(图像1)
plt.subplot(1,3,2),plt.imshow(image2),plt.title(图像2)
plt.subplot(1,3,3),plt.imshow(newimage),plt.title(图像1图像2) cv2.addWeighted()函数参数解析: src1图像1矩阵alpha图像1系数src2图像2矩阵 beta图像2系数 gamma常数项 结果 cv2.merge()图像合并 cv2.merge()是OpenCV库中的一个函数主要用于将多个单通道图像合并为一个多通道图像。该函数通常接受一个包含若干图像的元组或列表作为输入这些图像需要具有相同的尺寸。
#图像合并
import cv2
import matplotlib.pyplot as plt
plt.rcParams[font.sans-serif][SimHei]
imagecv2.imread(test.jpg,cv2.IMREAD_COLOR_RGB)
r,g,bcv2.split(image)#先将图片拆分为3个单通道的图像
merged_imagecv2.merge([r,g,b])#将3个单通道图像合并为原图像
#在合并单通道图像时需要将各个通道的图像数据按照元祖或列表的形式传入,且每个图像数据的尺寸需要一致
#合并后的图像shape为:(高,宽,各图像通道数之和)
plt.imshow(merged_image)
结果 当然,多通道图像之间也可以合并,只要他们的形状一致即可,比如上述代码中的merged_image我们可以使用索引切片来将图像rg与b这两个图像(2通道1通道)进行合并。
randgimage[:,:,0:2]
bimage[:,:,2]
merged_imagecv2.merge([rang,b]) 但是,对于RGB图像而言,通道数最多不超过4(png图像多一个alpha通道),所以当你试图将两个RGB图象使用cv2.merge()函数合并后,无论是cv2.imshow()还是plt.imshow()都将无法正常显示图像,因为合并后的图像的通道数4. cv2.copyMakeBorder()边界填充 边界填充是图像处理中的一种常见操作它通过在图像的边界周围添加额外的像素来改变图像的大小。这一操作在许多图像处理任务中都是必不可少的。在卷积神经网络CNN中进行图像分类或目标检测时为了保持输入图像尺寸的一致性常常需要对原始图像进行边界填充。此外边界填充还可以用于创建图像的镜像效果或者在图像拼接时减少接缝处的突兀感。 cv2.copyMakeBorder函数便是opencv内置用来进行图像填充的函数,它可以在图像的四周或特定的一侧添加指定宽度和类型的边框。
#边界填充cv2.copyMakeBorder()
import cv2
import matplotlib.pyplot as plt
plt.rcParams[font.sans-serif][SimHei]
imagecv2.imread(test.jpg,cv2.IMREAD_COLOR_RGB)
defaultcv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_DEFAULT)
reflectcv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_REFLECT)
isolatedcv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_ISOLATED)
wrapcv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_WRAP)
replicatecv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_REPLICATE)
reflect101cv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_REFLECT101)
constantcv2.copyMakeBorder(srcimage,top20,bottom20,left20,right20,borderTypecv2.BORDER_CONSTANT,value(10,250,120))#绿色边框
#cv2.copyMakeBorder()参数详解:
#src:原图像数据
#top:图像顶部要添加的边框宽度
#bottom:图像底部要添加的边框宽度
#left:图像左侧要添加的边框宽度
#right:图像右侧要添加的边框宽度
#borderType:填充方式
#value:当borderType为CONSTANT时候可用,对于灰度图像它是一个标量值对于彩色图像它是一个包含三个值的元组B, G, R。
#所有填充方式:
#cv2.BORDER_CONSTANT: 添加一个固定颜色的边框颜色由value参数指定
#cv2.BORDER_REPLICATE: 复制图像边缘的像素值来填充边框
#cv2.BORDER_REFLECT: 镜像反射图像边缘的像素值来填充边框
#cv2.BORDER_WRAP: 使用图像的另一侧的像素值来填充边框
#cv2.BORDER_DEFAULT: 默认的边框类型通常与cv2.BORDER_REFLECT_101相同
#cv2.BORDER_REFLECT_101: 类似于 cv2.BORDER_REFLECT但略有不同通常用于避免重复的边缘像素。
#cv2.BORDER_ISOLATED:不处理边界,而是直接返回原始图像,即使传入了其他参数也被忽略。
fig,axsplt.subplots(3,3,figsize(10,8))
axs[0][0].imshow(image),axs[0][0].set_title(原图)
axs[0][1].imshow(default),axs[0][1].set_title(borderTypedefault)
axs[0][2].imshow(reflect),axs[0][2].set_title(borderTypereflect)
axs[1][0].imshow(isolated),axs[1][0].set_title(borderTypeisolated)
axs[1][1].imshow(wrap),axs[1][1].set_title(borderTypewrap)
axs[1][2].imshow(replicate),axs[1][2].set_title(borderTypereplicate)
axs[2][0].imshow(reflect101),axs[2][0].set_title(borderTypereflect101)
axs[2][1].imshow(constant),axs[2][1].set_title(borderTypeconstant)
plt.tight_layout() cv2.copyMakeBorder()函数参数详解 src 原图像数据 top 图像顶部要添加的边框宽度 bottom 图像底部要添加的边框宽度 left 图像左侧要添加的边框宽度 right 图像右侧要添加的边框宽度 broderType 填充方式 value 当borderType为CONSTANT时候可用,对于灰度图像,它是一个标量值,对于彩色图像,它是一个包含三个值的元组B, G, RBGR为三个颜色通道上的值。 boderType常用参数 cv2.BORDER_CONSTANT 添加一个固定颜色的边框颜色由value参数指定 cv2.BORDER_REPLICATE 复制图像边缘的像素值来填充边框 cv2.BORDER_REFLECT 镜像反射图像边缘的像素值来填充边框 cv2.BORDER_WRAP 使用图像的另一侧的像素值来填充边框 cv2.BORDER_DEFAULT 默认的边框类型通常与cv2.BORDER_REFLECT_101相同 cv2.BORDER_REFLECT_101 类似于cv2.BORDER_REFLECT但略有不同通常用于避免重复的边缘像素 cv2.BORDER_ISOLATED 不处理边界,而是直接返回原始图像,即使传入了其他参数也被忽略
结果 cv2.threshold()全局阈值法图像二值化 全局阈值法图像二值化是通过设定一个全局阈值将图像中的像素值分为两类高于阈值的像素被设置为最大值通常为白色低于阈值的像素被设置为最小值通常为黑色。这种二值化处理能够极大地简化图像信息突出目标特征为后续的图像分析、特征提取等步骤提供便利。在OpenCV中cv2.threshold()函数是实现这一功能的核心工具它允许用户灵活设置阈值和处理方式以满足不同的图像处理需求。
import cv2
imagecv2.imread(test.jpg,cv2.IMREAD_GRAYSCALE)
_,binary_imagecv2.threshold(srcimage,thresh100,maxval255,typecv2.THRESH_BINARYcv2.THRESH_OTSU)
#cv2.threshold()参数:
#src:原始图像通常是单通道8为灰度图
#thresh:阈值
#maxval:最大值,超过阈值的像素点的值都将被设为这个值
#type:阈值类型,cv2.THRESH_BINARY表示二值化类型
#返回值说明,cv2.threshold()函数返回两个值,第一个值是设定的thresh,第二个值是二值化后的图像数据
#常用type:
#cv2.THRESH_BINARY当像素值大于阈值时将其设置为最大值当像素值小于等于阈值时将其设置为0
#cv2.THRESH_BINARY_INV:与cv2.THRESH_BINARY相反,当像素值小于阈值时将其设置为最大值通常为255当像素值大于等于阈值时将其设置为0
#cv2.THRESH_TOZERO:当像素值大于阈值时保持不变当像素值小于等于阈值时将其设置为0。
#cv2.THRESH_TOZERO_INV:与cv2.THRESH_TOZERO相反,当像素值大于阈值时将其设置为0,当像素值小于等于阈值时保持不变。
#cv2.THRESH_TRUNC:像素值大于阈值时将其设置为阈值当像素值小于等于阈值时保持不变。
#cv2.THRESH_TRIANGLE:自动计算阈值基于Otsus方法的一种变体适用于双峰直方图即图像有两种主要的灰度分布
#cv2.THRESH_OTSU:自动计算阈值通过最大化类间方差来确定最佳阈值将图像分为前景和背景两部分。
#注意,以上几种type可以混合使用。
print(_)
cv2.imshow(binary image,binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows() 结果
说明 在对图像进行二值化处理时我们通常需要将其转化为灰度图像并且可能还需要对图像进行去噪、平滑等预处理操作以提高阈值处理的效果。
cv2.threshold()函数参数详解:
src 原始图像数据 thresh 阈值 maxval 最大值 type 阈值类型,cv2.THRESH_BINARY表示二值化类型
cv2.threshold()函数常用type详解 cv2.THRESH_BINARY 当像素值大于阈值时将其设置为最大值当像素值小于等于阈值时将其设置为0 cv2.THRESH_BINARY_INV 与cv2.THRESH_BINARY相反,当像素值小于阈值时将其设置为最大值通常为255当像素值大于等于阈值时将其设置为0 cv2.THRESH_TOZERO 当像素值大于阈值时保持不变当像素值小于等于阈值时将其设置为0。 cv2.THRESH_TOZERO_INV cv2.THRESH_TOZERO相反,当像素值大于阈值时将其设置为0,当像素值小于等于阈值时保持不变。 cv2.THRESH_TRUNC 像素值大于阈值时将其设置为阈值当像素值小于等于阈值时保持不变。 cv2.THRESH_TRIANGLE 自动计算阈值基于Otsus方法的一种变体适用于双峰直方图即图像有两种主要的灰度分布 cv2.THRESH_OTSU 自动计算阈值通过最大化类间方差来确定最佳阈值将图像分为前景和背景两部分。 #注意,以上几种type可以混合使用。 以上几种type可以混合使用比如示例代码中我们可以同时使用cv2.THRESH_BINARY与cv2.THRESH_OTSU方法。特别的,当你指定的type中含有cv2.THRESH_TRIANGLE,cv2.THRESH_OTSU 这两种自动计算阈值的方法时,此时我们传入的thresh将被忽略,并且cv2.threshold()函数返回值的第一个元素是自动计算出来的thresh。
cv2.adaptiveThreshold()自适应阈值法图像二值化
#cv2.adaptivethreshold()自适应阈值二值化
import cv2
imagecv2.imread(rtest.jpg,cv2.IMREAD_GRAYSCALE)
adaptive_binary_imagecv2.adaptiveThreshold(srcimage,maxValue255,blockSize11,C10,adaptiveMethodcv2.ADAPTIVE_THRESH_GAUSSIAN_C,thresholdTypecv2.THRESH_BINARY)
#src:图像数据通常是单通道8为灰度图
#maxValue:最大值,超过阈值的像素点的值都将被设为这个值
#adaptiveNethod:指定自适应阈值方法
#blockSize:整数,领域值,通常是奇数,表示计算阈值时考虑的像素领域大小
#C:整数,从计算的均值或加权均值中减去的常数
#thresholdType:与cv2.threshold()函数内的type取值一致
cv2.imshow(adaptive_binary_image,binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.adaptiveThreshold()参数详解:
src图像数据通常是单通道8为灰度图maxValue最大值,超过阈值的像素点的值都将被设为这个值adaptiveMethod指定自适应阈值方法blockSize整数,领域值,通常是奇数,表示计算阈值时考虑的像素领域大小C整数,从计算的均值或加权均值中减去的常数thresholdType与Threshold()函数内的type一致
cv2.adaptiveThreshold()常用adaptiveMethod详解 当我们使用adaptiveThreshold()对图像二值化操作时,adaptiveThreshold主要有以下两个取值。
cv2.ADAPTIVE_THRESH_MEAN_C均值二值化,计算领域内所有像素的均值并减C作为该点处的像素值cv2.ADAPTIVE_THRESH_GAUSSIAN_C高斯加权平均二值化,计算领域内所有像素的加权平均值并减C,权重按照高斯分布分配
图像形态学基本操作
cv2.morphologyEx()函数简介 cv2.morphologyEx 是 OpenCV 中用于执行各种形态学操作的函数。形态学操作是一种基于形状处理图像的方法常用于图像预处理、特征提取、噪声去除和形状分析等任务。 cv2.morphologyEx 函数能够执行多种形态学操作通过指定不同的操作类型可以实现膨胀、腐蚀、开运算、闭运算等效果。
cv2.morphologyEX函数参数详解
src 原图像数据通常是单通道8位灰度图 op指定形态学操作的类型 kernel 一个指定领域大小的ndarray矩阵,和卷积核类似,只不过运算方法不同 anchor锚点,结构元素(卷积核)的锚点位置 iterations 相应操作进行的次数,默认为1,次数越多,效果越明显 borderType 边界填充方式,与cv2.copyMakeBorder()函数中的borderType一致 borderValue 当borderType为cv2.BORDER_CONSTANT时,制定的填充边界的值,对于灰度图而言是一个值,对于彩色图而言是BGR三元组(B,G,R) cv2.morphologyEX()常见op形态学操作类型
cv2.MORPH_ERODE腐蚀操作cv2.MORPH_DILATE膨胀操作cv2.MORPH_OPEN开运算cv2.MORPH_CLOSE闭运算cv2.MORPH_TOPHAT顶帽操作cv2.MORPH_BLACKHAT黑帽操作cv2.MORPH_GRADIENT形态学梯度 cv2.erode()腐蚀操作 与膨胀相反,图像腐蚀(Erosion)是一种减少图像中白色物体大小的操作,它通过使用与膨胀相同的结构元素,但是规则不同,只有当结构元素完全覆盖在白色像素上时,结构元素中心位置的黑色像素会变为白色,这意味着物体的边界会向内收缩导致图像中的亮区域边缘向内收缩暗区域相应扩大。图像腐蚀常用于去除小的白色噪声点、分离粘连对象、细化图像结构等场景。
#cv2.erode()膨胀操作
import cv2
import numpy as np
imagecv2.imread(black.jpg,flagscv2.IMREAD_GRAYSCALE)
kernelnp.ones(shape(3,3,1))
eroded_imagecv2.erode(srcimage,kernelkernel,iterations1,borderTypecv2.BORDER_REPLICATE)
#cv2.erode()参数详解:
#src:原图像数据通常是单通道8位灰度图
#kernel:一个指定领域大小的ndarray矩阵,和卷积核类似,只不过运算方法不同,这里我们称他为结构元素
#iterations:腐蚀操作进行的次数,默认为1,次数越多,腐蚀效果越明显
#borderType:边界填充方式,与cv2.copyMakeBorder()函数中的borderType一致
#borderValue:当borderType为cv2.BORDER_CONSTANT时,制定的填充边界的值,对于灰度图而言是一个值,对于彩色图而言是BGR三元组(B,G,R)
cv2.imshow(src_mage,image)
cv2.imshow(eroded_image,eroded_image)
cv2.waitKey(0)
结果 显然,与之前的描述一致图像中的亮区域边缘向内收缩暗区域相应扩大
cv2.erode()函数参数详解
src 原图像数据通常是单通道8位灰度图 kernel 一个指定领域大小的ndarray矩阵,和卷积核类似,只不过运算方法不同,这里我们称他为结构元素 iterations 腐蚀操作进行的次数,默认为1,次数越多,腐蚀效果越明显 borderType 边界填充方式,与cv2.copyMakeBorder()函数中的borderType一致 borderValue 当borderType为cv2.BORDER_CONSTANT时,制定的填充边界的值,对于灰度图而言是一个值,对于彩色图而言是BGR三元组(B,G,R) 腐蚀原理 对图像腐蚀的原理很简单,就是结构元素(类似卷积核)沿着图像滑动(以结构元素的中心为参照点)如果与结构元素覆盖后对应的原图像的所有像素值都是1那么中心元素保持原来的值否则就变为0。这对于去除白噪声很有用也可以用于断开两个连在一起的物体。 观察示例中的图片,在左侧区域内,我们无论怎么移动3x3的kernel,能够满足卷积核覆盖后对应的原图像的所有像素值都是1的位置只有上边的黄色阶梯区域,对于黑白二值图像来说1为白色,0为黑色,所以一般来说对黑白图像进行腐蚀操作后会亮区域边缘向内收缩暗区域相应扩大。 cv2.dilate() 膨胀操作 图像膨胀(dilate)是一种主要用于增强图像中的亮区域或前景对象的图像处理技术。通过设定一个结构元素该算法会将图像中与结构元素相匹配的部分进行扩展使得图像中的亮区域边缘向外扩展暗区域相应缩小。这种操作在处理二值图像或灰度图像时非常有用特别是在需要突出图像中的特定结构或去除小孔和缝隙时。 在cv2中,cv2.dilate()函数可以用来实现上述功能
#cv2.dilate()膨胀操作
import cv2
import numpy as np
imagecv2.imread(black.jpg,flagscv2.IMREAD_GRAYSCALE)
kernelnp.ones(shape(3,3,1))
cv2.imshow(src_mage,image)
dilated_imagecv2.dilate(srcimage,kernelkernel,iterations1,borderTypecv2.BORDER_REPLICATE)
#cv2.dilate()参数详解:
#src:原图像数据通常是单通道8位灰度图
#kernel:一个指定领域大小的ndarray矩阵,和卷积核类似,只不过运算方法不同
#iterations:膨胀操作进行的次数,默认为1,次数越多,膨胀效果越明显
#borderType:边界填充方式,与cv2.copyMakeBorder()函数中的borderType一致
#borderValue:当borderType为cv2.BORDER_CONSTANT时,制定的填充边界的值,对于灰度图而言是一个值,对于彩色图而言是BGR三元组(B,G,R)
cv2.imshow(dilated_image,dilated_image)
cv2.waitKey(0)
结果 显然,与之前的描述一致图像中的亮区域边缘向外扩展暗区域相应缩小。
cv2.dilate()函数参数详解
src 原图像数据通常是单通道8位灰度图 kernel 一个指定领域大小的ndarray矩阵,和卷积核类似,只不过运算方法不同 iterations 膨胀操作进行的次数,默认为1,次数越多,膨胀效果越明显 borderType 边界填充方式,与cv2.copyMakeBorder()函数中的borderType一致 borderValue 当borderType为cv2.BORDER_CONSTANT时,制定的填充边界的值,对于灰度图而言是一个值,对于彩色图而言是BGR三元组(B,G,R) 膨胀原理 膨胀的操作与腐蚀相反这里的相反指的是运算相反,而不是值相反。膨胀操作的结构元素(类似卷积核)沿着图像滑动(以卷积核的中心为参照点)如果与结构元素覆盖后对应的原图像的像素值只要有一个是1中心像素值就是1,否则为0。对于灰度化二值图像来说1为白色,0为黑色,所以一般来说对黑白图像进行膨胀操作后会亮区域边缘向外扩展暗区域相应缩小。 cv2.morphologyEx()实现开闭运算
开运算原理 图像的开运算是指对图像先腐蚀后膨胀的过程。这个过程有助于去除小的对象即前景中的小白点在分离物体、消除小颗粒噪声或“断开”物体之间的连接时非常有用。开运算可以使得物体的轮廓变得平滑同时减小其面积而不会影响物体的整体形状和位置。在处理二值图像或灰度图像时开运算是一种非常有效的形态学处理方法。 开运算原理图
闭运算原理 图像的闭运算是指对图像先膨胀后腐蚀的过程,这个过程常用于填补图像中的小孔或狭缝以及连接相邻的物体。闭运算能够使物体的轮廓变得更为平滑同时增加其面积但不会显著改变物体的整体形状和位置。在二值图像或灰度图像的处理中闭运算也是一种非常有用的形态学处理方法特别是在需要填补图像中的小缺陷或连接相邻的分割区域时。通过闭运算可以使得图像中的物体更加完整和连贯为后续的图像分析或识别工作提供便利。 闭运算原理图
代码
import cv2
import numpy as np
kernelnp.ones(shape(3,3))
imagecv2.imread(black.jpg)
opened_imagecv2.morphologyEx(srcimage,opcv2.MORPH_OPEN,kernelkernel,anchor(-1,1),iterations1,borderTypecv2.BORDER_CONSTANT,borderValue25)
closed_imagecv2.morphologyEx(srcimage,opcv2.MORPH_CLOSE,kernelkernel,anchor(-1,1),iterations1,borderTypecv2.BORDER_CONSTANT,borderValue25)
cv2.imshow(image,image)
cv2.imshow(opened_image,opened_image)
cv2.imshow(closed_image,closed_image)
cv2.waitKey(0)
使用cv2.morphologyEx()函数分别实现开运算与闭运算
结果 图像几何变化操作
图像直方图修正操作
图像空域滤波操作