一直以来向社区选取,最近搞了一点小东西。一方面回馈社区,一方面留个记录,方便自己以后查找。声明:水平有限,不好勿喷(怕)
最近在和小伙伴做基于风4的海雾识别,几个判据之后,还有一些不均匀的,零碎的,单个的积云也被识别为海雾。在老师的建议下,我们使用灰度共生矩阵来剔除这些零碎的积云。
一·问题分析——先来看图。
1处的很小的碎点,2处的粗糙处,认为是碎积云,均要剔除。左上角均匀的地方,认为是雾。
二·参考
1·灰度共生矩阵的了解,参考自(8条消息) 对数据集使用GLCM(灰度共生矩阵)进行纹理提取_tenju的博客-CSDN博客_fast_glcm
2·对数据求灰度共生矩阵的函数,参考自
LinghuiXia/GLCM: 本实验的主要目的是基于遥感图像计算灰度共生矩阵,并基于该矩阵计算多种纹理特征。所有的计算结果已与ENVI结果进行对比,实验结果一致。 (github.com)
三·思路:我们处理后的数据只有1和0,分别代表有雾和无雾,利用灰度共生矩阵,统计出窗口内1,0相邻的个数,如果该个数较大,说明是图中2的情况,将其赋值为零剔除;统计出窗口内1,1相邻的个数,如果很小,则对应图中1的情况,同样赋0剔除。
四·这是处理之后的结果,已经将大量不均匀的碎积云剔除。
五·子函数及剔除程序(其中用到的包,去第二节第2个的get_glcm和main文件里找)
#
# 第二部分算法修改。
# 下面两个子函数摘自第二节的第2个,作用是求对应数据的灰度共生矩阵。
def image_patch(img2, slide_window, h, w):
image = img2
window_size = slide_window
patch = np.zeros((slide_window, slide_window, h, w), dtype=np.uint8)
for i in range(patch.shape[2]):
for j in range(patch.shape[3]):
patch[:, :, i, j] = img2[i : i + slide_window, j : j + slide_window]
return patch
def calcu_glcm(img, vmin=0, vmax=255, nbit=2, slide_window=7, step=[2], angle=[0]):
mi, ma = vmin, vmax
h, w = img.shape
# Compressed gray range:vmin: 0-->0, vmax: 256-1 -->nbit-1
bins = np.linspace(mi, ma+1, nbit+1)
img1 = np.digitize(img, bins) - 1
# (512, 512) --> (slide_window, slide_window, 512, 512)
img2 = cv2.copyMakeBorder(img1, floor(slide_window/2), floor(slide_window/2)
, floor(slide_window/2), floor(slide_window/2), cv2.BORDER_REPLICATE) # 图像扩充
patch = np.zeros((slide_window, slide_window, h, w), dtype=np.uint8)
patch = image_patch(img2, slide_window, h, w)
# Calculate GLCM (5, 5, 512, 512) --> (64, 64, 512, 512)
# greycomatrix(image, distances, angles, levels=None, symmetric=False, normed=False)
glcm = np.zeros((nbit, nbit, len(step), len(angle), h, w), dtype=np.uint8)
for i in range(patch.shape[2]):
for j in range(patch.shape[3]):
glcm[:, :, :, :, i, j]= greycomatrix(patch[:, :, i, j], step, angle, levels=nbit)
return glcm
#下面是将fog数据先化为想要的二维,再对其求灰度相关矩阵,最后利用灰度相关矩阵的计数结果对矩阵对应的像素点周围数据进行剔除。
fog = fog.reshape(rows,cols)
nbit = 2 # gray levels
mi, ma = 0,1 # max gray and min gray
slide_window = 5 # sliding window
# step = [2, 4, 8, 16] # step
# angle = [0, np.pi/4, np.pi/2, np.pi*3/4] # angle or direction
step = [2]
angle = [np.pi/4]
h, w = fog.shape
glcm = calcu_glcm(fog, mi, ma, nbit, slide_window, step, angle)
for i in range(glcm.shape[2]):
for j in range(glcm.shape[3]):
glcm_cut = np.zeros((nbit, nbit, h, w), dtype=np.float32)
glcm_cut = glcm[:, :, i, j, :, :]
#剔除大片不均匀
for m in range(rows):
for n in range(cols):
if(glcm_cut[0,1,m,n]+glcm_cut[1,0,m,n]>10) :
fog[m-2:m,n-2:n]=0
#剔除单个碎点
for m in range(rows):
for n in range(cols):
if(glcm_cut[1,1,m,n]<10) :
fog[m-2:m,n-2:n]=0