python画灰度图,python图片灰度处理
跟我学Python图像处理,基于灰度3D图像的图像高帽操作和黑帽操作_华为云开发者社区技术博客_博客
本文讲解了灰度三维图像的高帽操作和黑猫操作,通过Python调用OpenCV函数实现。
本文由eastmount分享自华为云社区《[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算》。
本文继续深入,结合灰度3D图像讲解图像高帽操作和图像黑猫操作,通过Python调用OpenCV函数实现。
1.图像礼帽变换,也称图像礼帽变换,是原始图像减去图像开运算的结果。它常被用来解决由于光照不均匀造成的图像分割错误问题。该公式定义如下:
图像高帽操作是利用一个结构元素,通过开操作从一幅图像中删除对象,以校正光照不均匀的影响。其效果图如下图所示。
在Python中,图像封顶操作主要通过调用morphologyEx()来实现,其中参数cv2。MORPH_TOPHAT表示封顶处理,函数原型如下:
dst=cv2.morphologyEx(src,cv2。MORPH_TOPHAT,内核)
Src表示原始图像cv2。MORPH_TOPHAT表示图像封顶操作内核表示卷积内核,numpy.ones()函数可用于构造米粒图像,假设存在不均匀张光照。如图,我们需要调用图像封顶操作来解决光照不均匀的问题。它的Python代码如下:
#编码:utf-8
导入cv2
将numpy作为np导入
#阅读图片
src=cv2.imread(test06.png ,cv2。IMREAD _未更改)
#设置卷积内核
kernel=np.ones((10,10),np.uint8)
#图像礼帽操作
result=cv2.morphologyEx(src,cv2。MORPH_TOPHAT,内核)
#显示图像
cv2.imshow(src ,src)
cv2.imshow(result ,结果)
#等待显示
cv2.waitKey(0)
2.cv2.destroyAllWindows()的运行结果如下。它有效地将米粒从背景中分离出来。
第二,形象黑帽运营。底帽变换也称为图像黑帽运算。它是通过图像闭运算减去原始图像的结果,从而得到图像内部的孔洞或前景中的黑点。它还经常用于解决由于光照不均匀而导致的图像分割错误问题。该公式定义如下:
图像底盖操作是通过用结构元素进行闭合操作来删除图像中的对象,常用于校正光照不均匀的影响。其效果图如下图所示。
在Python中,图像封顶操作主要通过调用morphologyEx()来实现,其中参数cv2。MORPH_BLACKHAT表示加盖或黑帽处理。该函数的原型如下:
dst=cv2.morphologyEx(src,cv2。MORPH_BLACKHAT,内核)
Src表示原始图像cv2。MORPH_BLACKHAT表示图像的底帽或黑帽操作。kernel表示卷积核。可以使用numpy.ones()函数构建Python来实现图像的底帽操作,如下:
#编码:utf-8
导入cv2
将numpy作为np导入
#阅读图片
src=cv2.imread(test06.png ,cv2。IMREAD _未更改)
#设置卷积内核
kernel=np.ones((10,10),np.uint8)
#图像黑帽操作
result=cv2.morphologyEx(src,cv2。MORPH_BLACKHAT,内核)
#显示图像
cv2.imshow(src ,src)
cv2.imshow(result ,结果)
#等待显示
cv2.waitKey(0)
2.cv2.destroyAllWindows()的运行结果如图所示:
3.基于灰度三维图的高帽和黑帽操作。
为什么图像封顶操作会消除光照不均匀的效果?一般可以用一个灰度三维图来解释算法。灰度三维图主要通过Axes3D包实现,绘制原始图像灰度三维图的代码如下:
# -*-编码:utf-8 -*-
将numpy作为np导入
将cv2作为cv导入
将matplotlib.pyplot作为plt导入
从mpl_toolkits.mplot3d导入Axes3D
从matplotlib导入cm
从matplotlib.ticker导入LinearLocator,FormatStrFormatter
#阅读图像
img=cv.imread(test06.png )
img=cv.cvtColor(img,cv。COLOR_BGR2GRAY)
imgd=NP . array(img)# image class to numpy
#准备数据
sp=img.shape
H=int(sp[0]) #图像高度(行)
W=int(sp[1]) #图像的图像宽度(列)
#图纸的初始处理
fig=plt.figure(figsize=(16,12))
ax=fig.gca(投影=3d )
x=np.arange(0,w,1)
y=np.arange(0,h,1)
x,y=np.meshgrid(x,y)
z=imgd
surf=ax.plot_surface(x,y,z,cmap=cm.coolwarm)
#自定义Z轴
ax.set_zlim(-10,255)
ax . zaxis . Set _ major _ locator(linear locator(10))#设置Z轴上网格线的密度。
#将Z的值字符串转换为float并保留两位小数
ax . zaxis . set _ major _ formatter(FormatStrFormatter( % . 02f ))
#设置坐标轴的标签和标题
ax.set_xlabel(x ,size=15)
ax.set_ylabel(y ,size=15)
ax.set_zlabel(z ,size=15)
ax.set_title(表面图,weight=bold ,size=20)
#在右侧添加颜色卡栏
图.颜色条(表面,收缩=0.6,纵横比=8)
plt.show()的运行结果如下图所示:
从图像中像素的趋势来看,说明图像受到各部分光照不均匀的影响,导致背景灰度不均匀,其中凹陷对应的是图像中灰度值相对较小的区域。图像白帽运算后的三维灰度图像的编码如下:
# -*-编码:utf-8 -*-
将numpy作为np导入
将cv2作为cv导入
将matplotlib.pyplot作为plt导入
从mpl_toolkits.mplot3d导入Axes3D
从matplotlib导入cm
从matplotlib.ticker导入LinearLocator,FormatStrFormatter
#阅读图像
img=cv.imread(test06.png )
img=cv.cvtColor(img,cv。COLOR_BGR2GRAY)
#图像黑帽操作
kernel=np.ones((10,10),np.uint8)
结果=cv.morphologyEx(img,cv。MORPH_BLACKHAT,内核)
#图像类到numpy
imgd=np.array(结果)
#准备数据
sp=结果.形状
H=int(sp[0]) #图像高度(行)
W=int(sp[1]) #图像的图像宽度(列)
#图纸的初始处理
fig=plt.figure(figsize=(8,6))
ax=fig.gca(投影=3d )
x=np.arange(0,w,1)
y=np.arange(0,h,1)
x,y=np.meshgrid(x,y)
z=imgd
surf=ax.plot_surface(x,y,z,cmap=cm.coolwarm)
#自定义Z轴
ax.set_zlim(-10,255)
ax . zaxis . Set _ major _ locator(linear locator(10))#设置Z轴上网格线的密度。
#将Z的值字符串转换为float并保留两位小数
ax . zaxis . set _ major _ formatter(FormatStrFormatter( % . 02f ))
#设置坐标轴的标签和标题
ax.set_xlabel(x ,size=15)
ax.set_ylabel(y ,size=15)
ax.set_zlabel(z ,size=15)
ax.set_title(表面图,weight=bold ,size=20)
#在右侧添加颜色卡栏
图.颜色条(表面,收缩=0.6,纵横比=8)
plt.show()效果图如下图,对应的灰度更集中在10到100的范围内,证明不均匀的背景已经被大致消除,有利于后续的阈值分割或者图像分割。
第一时间点击了解华为云鲜技术~
原创作品来自华为云开发者联盟,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。