爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4154|回复: 0

[经验总结] python 灰度共生矩阵 计数原理剔除海雾识别中的碎积云

[复制链接]

新浪微博达人勋

发表于 2022-11-14 16:54:12 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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文件里找)
&#8203;# <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


密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表