基于超像素生成的图片数据预测生成显著性检测(1)

文章目录

  • 题目
  • 一、思路
  • 二、基本步骤
    • 1.导入图片并压缩
    • 2.对压缩后的图片进行超像素分割
    • 3.建立一个超像素个数*9的矩阵
    • 4.生成带有标签的矩形框图片
  • 总结


题目

基于超像素生成的图片数据,进行网络搭建,并预测生成显著性区域
提示:以下是本篇文章正文内容,下面案例可供参考

一、思路

对于每张超像素分割的图片

  1. 生成刚好能框住超像素点的矩形框
  2. 生成稍大一点的矩形框框住每个超像素点(大约大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,做出这样的数据就可以拿到网络里去训练了
基于超像素生成的图片数据预测生成显著性检测(1)_第1张图片
基于超像素生成的图片数据预测生成显著性检测(1)_第2张图片

总结

你可能感兴趣的:(opencv,python,计算机视觉)