- 积分
- 171
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2022-5-18
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 气象炮泡 于 2024-7-18 17:33 编辑
最近在和小伙伴做基于风4的海雾识别,几个判据之后,还有一些不均匀的,零碎的,单个的积云也被识别为海雾。在老师的建议下,我们使用灰度共生矩阵来剔除这些零碎的积云。
一·问题分析——先来看图。
​编辑
1处的很小的碎点,2处的粗糙处,认为是碎积云,均要剔除。左上角均匀的地方,认为是雾。
二·参考
1·灰度共生矩阵的了解,参考自https://blog.csdn.net/tenju/article/details/125937841
2·对数据求灰度共生矩阵的函数,参考自LinghuiXia/GLCM: https://github.com/LinghuiXia/GLCM
三·思路:我们处理后的数据只有1和0,分别代表有雾和无雾,利用灰度共生矩阵,统计出窗口内1,0相邻的个数,如果该个数较大,说明是图中2的情况,将其赋值为零剔除;统计出窗口内1,1相邻的个数,如果很小,则对应图中1的情况,同样赋0剔除。
四·这是处理之后的结果,已经将大量不均匀的碎积云剔除。
​编辑
五·子函数及剔除程序(其中用到的包,去第二节第2个的get_glcm和main文件里找)
​# <codecell># 第二部分算法修改。
# 下面两个子函数摘自第二节的第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
|
|