基于python的砂轮图像处理

废话少说,直接上图,其中My method是我的处理效果,GT method是一个对比效果图,Source为原图,其他为处理过程中的一些图。

总体来说我的效果图中分部的边缘处理较好,第二张应该使用一定的膨胀,我觉得膨胀和腐蚀容易让边缘失真。仁者见仁智者见智吧。

没有很多的时间去进一步弄了,就这样吧。

接着是代码:

#-----------------------------------
#   砂轮图像处理
#
#   子倾
#   2012.12.30
#   主要思想:分割提取各个通道以及相关边缘的信息进行融合
#-----------------------------------

# 导入相关库,类似于C中的include
import skimage
import skimage.morphology as sm
import matplotlib.pyplot as plt
from skimage import io,morphology,exposure,color,filters

#  读取图片
img=io.imread('f:\source.jpg')    #读入待处理图片
GTimg=io.imread('f:\GT.png')      #理想效果图

hsv=color.convert_colorspace(img,'RGB','HSV') #将RGB图转为HVS空间表示
image = skimage.color.rgb2grey(img) #灰度化

image=exposure.equalize_hist(image) #亮度均衡化

#阈值处理,保留图片高亮部分,目的是获取高亮部分作为补偿,因为反光部分往往是我们需要的
dst_tt =morphology.closing(image < 0.95, morphology.square(2))

#处理掉高亮部分图中的部分小点,之所以要将图像取反,是因为下面的函数是针对连通白点区域处理的
dst_tt = ~dst_tt
dst_tt=morphology.remove_small_objects(dst_tt,min_size=50,connectivity=1)
dst_tt = ~dst_tt


 #阈值,去原图亮度较低部分。
dst_t =morphology.closing(image > 0.22, morphology.square(2))


dst = dst_t*0.5 + dst_tt*0.5  #叠加融合亮度高和亮度低的部分

 #阈值,实际上这步就是将两个图像做或运算
dst_c =morphology.closing(dst > 0.5, morphology.square(2))


dst = dst_c #这一步的目的是改一下变量名而已,下面全局主要以dst为目标一直往下处理

#滤除一下不必要的黑色小块,这样的做法比中值滤波效果要好
dst = ~dst
dst=morphology.remove_small_objects(dst,min_size=50,connectivity=1)
dst = ~dst

#----------------------------------------------------------------------
#取得hsv图像的s通道做融合处理
hsv_s = hsv[:,:,1]
hsv_s =morphology.closing(hsv_s > 0.40, morphology.square(1)) #阈值

#去除白色小块
hsv_s=morphology.remove_small_objects(hsv_s,min_size=120,connectivity=1) 

hsv_s=~hsv_s #取反

dst = hsv_s*0.5+ dst*0.5 #叠加融合到前期处理的dst中
#阈值,这一步和上一步等于两个图像做或运算
dst =morphology.closing(dst > 0.5, morphology.square(2)) 

#填补白色的洞,或是说黑色包围的比区域,6000是面积参数
dst=morphology.remove_small_objects(dst,min_size=6000,connectivity=1)

#----反向移除黑点----------------
dst = ~dst
dst=morphology.remove_small_objects(dst,min_size=120,connectivity=1)
dst = ~dst

dst_temp = dst #临时保存当前成果

#----------------------------------------------------------------------
#下面就是提取hsv图像中的v通道的有用信息进行融合,具体操作和上面类似,不赘述
hsv_v= hsv[:,:,2]
hsv_v =morphology.closing(hsv_v > 0.47, morphology.square(1)) #阈值

hsv_v = ~hsv_v
hsv_v=morphology.remove_small_objects(hsv_v,min_size=400,connectivity=1)
hsv_v = ~hsv_v
hsv_v=sm.erosion(hsv_v,sm.square(2))


dst = hsv_v*0.5+ dst*0.5 #叠加融合
dst =morphology.closing(dst > 0.5, morphology.square(2))

dst=morphology.remove_small_objects(dst,min_size=600,connectivity=1)

#————————————————————————————————————————————————————----------------
#这部分使用边缘信息来修复,我比较强调保持边缘的真实,所以我很少使用膨胀和腐蚀

edges = filters.sobel(dst)#获取边缘图
edges =morphology.closing(edges > 0.05, morphology.square(2))#适度阈值

dst = edges 
dst = ~dst

#填充比区域
dst=morphology.remove_small_objects(dst,min_size=3000,connectivity=1)

# 做融合
dst = dst*0.5+ dst_temp*0.5 
dst =morphology.closing(dst > 0.5, morphology.square(2))

dst=morphology.remove_small_objects(dst,min_size=300,connectivity=4)

dst=sm.dilation(dst,sm.square(2))
dst=sm.dilation(dst,sm.square(2))
#dst=sm.erosion(dst,sm.square(2))
dst_temp = dst

edges = filters.sobel(dst)
edges =morphology.closing(edges > 0.05, morphology.square(2))


#————————————————————————————————————————————————————------------------
plt.figure(num='Funny',figsize=(13,9)) 

plt.subplot(3,3,1)
plt.title('My method')
plt.imshow(dst,plt.cm.gray)
  
plt.subplot(3,3,2)
plt.title('GT method') 
plt.imshow(GTimg,plt.cm.gray)

plt.subplot(3,3,3)
plt.title('Source')
plt.imshow(img)

plt.subplot(3,3,4)
plt.title('equalize_hist')
plt.imshow(image,plt.cm.gray)

#plt.subplot(3,3,5)
#plt.title('threshold')
#plt.imshow(dst_tt,plt.cm.gray)

plt.subplot(3,3,5)
plt.title('dst_c')
plt.imshow(dst_c,plt.cm.gray)

plt.subplot(3,3,6)
plt.title('hsv')
plt.imshow(hsv)

plt.subplot(3,3,7)
plt.title('hsv_v')
plt.imshow(hsv_v,plt.cm.gray)

plt.subplot(3,3,8)
plt.title('hsv_s')
plt.imshow(hsv_s,plt.cm.gray)

#plt.subplot(3,3,9)
#plt.title('hsv_v')
#plt.imshow(hsv[:,:,2],plt.cm.gray)

plt.subplot(3,3,9)
plt.title('test')
plt.imshow(~edges,plt.cm.gray)


plt.show()

dst = dst*0.9999
io.imsave('f:/Result.jpg', dst)

 

posted @ 2016-12-30 13:45  子倾  阅读(1065)  评论(0)    收藏  举报