缘由
在做一个深度学习的课题,打算做一个自动化采集数据集的自动化设备,运动设备与相机采集曝光频率往往对不上,偶尔会出现卡吨、延迟现象,所以做了一个简易的针对性强的自动筛选的python程序。主要用的是拉斯锐度检测的手段。
主要思路
由于移动的时候,样品变动的位子是局部变动,如果出现模糊,并非式整张图片都是模糊的。而且拉斯变换fm_src= variance_of_laplacian(ROI),这个语句选取的是整张图的数据,所以如果局部出现模糊,可能会由于其他地方清晰而把整个值给拉高。
所以我将800x800的图片分成了256个100x100的图片(100x100最少应该是8x8,64张图才对,因为有些图截取ROI是,会截取到半张或者小部分,这样拉斯变化出来的锐度图值会很小,与模糊的图片出现相似的值,容易出错。所以我用了一个标准差来进行判断,因为我检测的样品,部分位置是空的,用个标准差去判断,可以减少很多计算时间。)
最后的判断指标我使用了拉斯模糊3X3的mask去做,再与原始图的锐度值去做对比,为什么直接用锐度指标判断,因为我的样品品的测试表面主要是一种梯度平稳渐变的图形,他的表面斜度使得跟模糊的趋势一直,所以针对这类样品,我发现他们之间相除存在一定规律,经过拉斯平滑后与未经过拉斯平滑后相除小于0.07的为模糊图片。
下面是我的具体算法:
path_name='/home/zc/Desktop/PASSIVE'
out_path='/home/zc/Desktop/PASSIVE_CLEAR'
image_list = os.listdir(path_name)
list.sort(image_list)
blur_list=[]
part_num=14 #分成了多少个小图像来检测
for name in image_list:
img=cv2.imread(path_name+'/'+name)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
flag_blur=0 #是否存在模糊图像的标志
#print(name)
for part_x in range(part_num): #给了一个容错误差,小图片存在两个及两个以上才判断为模糊图片
if flag_blur==2:
break
for part_y in range(part_num):
ROI = np.ones((100, 100, 1))
ROI=gray[part_x*50:(part_x)*50+100,part_y*50:(part_y)*50+100]
pixel_ave=cv2.meanStdDev(ROI)[0][0] #方差,均值
pixel_num=0
pixel_MSE=cv2.meanStdDev(ROI)[1][0]
#if pixel_MSE<20:continue #两种判断手段,一种用方差,另外一个种用大于平均数的像素点
for i in range(len(ROI)):
for j in range(len(ROI)):
if ROI[i][j]>pixel_ave+10:
pixel_num+=1
# else :ROI[i][j]=pixel_ave
blur_image=cv2.GaussianBlur(ROI,(3,3),0) #拉斯平滑
#blur_image_1=cv2.blur(ROI,(3,3),0)
#fil_para=32
#blur_image_2=cv2.bilateralFilter(ROI,fil_para,fil_para/2,fil_para*2)
if pixel_num>2000:
fm_src= variance_of_laplacian(ROI)
fm_blur= variance_of_laplacian(blur_image)
#fm_blur_1= variance_of_laplacian(blur_image_1)
#fm_blur_2= variance_of_laplacian(blur_image_2)
#if fm<35:
#blur_list.append(name)
#score=(math.sqrt(fm_src))/fm_blur
#score=fm_blur/fm_blur_1
#print(name,part_x,part_y,' value is',fm_src,fm_blur,fm_blur_1,fm_blur_2)
#print(name,part_x,part_y,' value is',fm_src,fm_blur/fm_src,fm_blur_1/fm_src,fm_blur_2/fm_src,fm_blur_2/fm_blur)
print(fm_blur/fm_src,fm_src)
if fm_src>20 and fm_blur/fm_src<0.07: #存在一定比值规律
flag_blur+=1
#cv2.imwrite('/home/zc/Desktop/blur_test/'+str(part_x)+str(part_y)+'.bmp',ROI)
#cv2.imwrite('/home/zc/Desktop/blur_test/'+str(part_x)+str(part_y)+'bbbbb.bmp',blur_image_2)
break
# if part_y==7:break
#if part_x==7:break
# break
# break
if flag_blur<2:
blur_list.append(name)
for name in blur_list:
shutil.copy(path_name+'/'+name,out_path)
图1 底端存在模糊现象