题目
基于超像素生成的图片数据,进行网络搭建,并预测生成显著性区域提示:以下是本篇文章正文内容,下面案例可供参考
一、思路
对于每张超像素分割的图片
- 生成刚好能框住超像素点的矩形框
- 生成稍大一点的矩形框框住每个超像素点(大约大30%~50%)
对于矩形框在,重新编排尺寸(50,50),打上0、1标签送入网络学习
二、基本步骤
1.导入图片并压缩
'''导入原图与mask'''
img=cv2.imread("../image/ILSVRC2012_test_00000018.jpg")
img_mask=cv2.imread("../imagemask/ILSVRC2012_test_00000018.png")
size=(300,300)
'''压缩到300*300'''
img = cv2.resize(img,size)
img_mask=cv2.resize(img_mask,size)
2.对压缩后的图片进行超像素分割
'''超像素分割'''
kernel_size=(5,5)
sigma=1.5
IS=cv2.GaussianBlur(img,kernel_size,sigma)
print("IS尺寸:",IS.shape)
#初始化slic项,超像素平均尺寸20(默认为10),平滑因子20
slic = cv2.ximgproc.createSuperpixelSLIC(img,region_size=20,ruler = 20.0)
slic.iterate(10) #迭代次数,越大效果越好
mask_slic = slic.getLabelContourMask() #获取Mask,超像素边缘Mask==1
label = slic.getLabels() #获取超像素标签
number_slic = slic.getNumberOfSuperpixels() #获取超像素数目
(m,n)=label.shape
print("超像素标签尺寸:",label.shape)
print("超像素数目:",number_slic)
mask_inv_slic = cv2.bitwise_not(mask_slic)
img_slic=cv2.bitwise_and(img,img,mask=mask_inv_slic) #在原图上绘制超像素边界
img_mask_slic=cv2.bitwise_and(img_mask,img_mask,mask=mask_inv_slic)
3.建立一个超像素个数*9的矩阵
建立一个num*5维的矩阵,用于保存超像素的信息(每行分别为每个超像素的平均横坐标,平均纵坐标,平均R,平均G,平均B,minx左上,miny左下,maxx右上,maxy右下)。根据原图与label的对应关系求出矩阵。
supmean= np.zeros((number_slic,9),dtype=np.uint64)
labelnum=np.zeros(number_slic)
for i in range(0,number_slic):
supmean[i,5]=supmean[i,6]=99999999
supmean[i,7]=supmean[i,8]=0
for i in range(0,m):
for j in range(0,n):
supmean[label[i][j],0]=supmean[label[i][j],0]+i
supmean[label[i][j],1]=supmean[label[i][j],1]+j
supmean[label[i][j],2]=(supmean[label[i][j],2]+np.uint64(IS[i][j][0]))
supmean[label[i][j],3]=(supmean[label[i][j],3]+np.uint64(IS[i][j][1]))
supmean[label[i][j],4]=(supmean[label[i][j],4]+np.uint64(IS[i][j][2]))
'''对每个超像素区域找到他的左上、左下、右上、右下'''
supmean[label[i][j],5]=min(supmean[label[i][j],5],i) # minx
supmean[label[i][j],6]=min(supmean[label[i][j],6],j) # miny
supmean[label[i][j],7]=max(supmean[label[i][j],7],i) # maxx
supmean[label[i][j],8]=max(supmean[label[i][j],8],j) # maxy
labelnum[label[i][j]]=labelnum[label[i][j]]+1
for i in range(0,number_slic):
supmean[i][0]=np.uint16(supmean[i][0]/labelnum[i])
supmean[i][1]=np.uint16(supmean[i][1]/labelnum[i])
supmean[i][2]=np.uint16(supmean[i][2]/labelnum[i])
supmean[i][3]=np.uint16(supmean[i][3]/labelnum[i])
supmean[i][4]=np.uint16(supmean[i][4]/labelnum[i])
#print([supmean[i][0],supmean[i][1]])
4.生成带有标签的矩形框图片
这里仅仅生成了刚好框住的矩形框,并没有生成扩大的,据老师说前者比后者的结果会差10%左右
'''生成小矩形图片'''
size2=(50,50)
for i in range(0,number_slic):
t=i+0*218
img_0 = img_mask[supmean[i][6]:supmean[i][8], supmean[i][5]:supmean[i][7]]
img_1 = img[supmean[i][6]:supmean[i][8], supmean[i][5]:supmean[i][7]]
if(img_1.shape[0]!=0 and img_1.shape[1]!=0):
if(len(img_0[img_0==255])>len(img_0[img_0==0])):#白色图
cv2.imwrite("dataset/train1/1/tr" + str(t) + ".jpg", cv2.resize(img_1,(50,50)))
else:#黑色图
cv2.imwrite("dataset/train1/0/tr" + str(t) + ".jpg", cv2.resize(img_1,(50,50)))
这里标签是基于矩形框框在mask图上时,每个矩形框所占的黑白像素的比例,白的多就打为标签1,黑的多就打为标签0,做出这样的数据就可以拿到网络里去训练了