提取图像岛屿算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15642411/article/details/83997237

利用传统图像算法提取岛屿
1、建立掩模(B>R+G)
2、利用mask将其分割
3、阈值化(自己根据经验)
4、填洞
5、膨胀
6、寻找最大面积轮廓
7、最终的mask和原图逻辑与运算
效果图如下:
在这里插入图片描述在这里插入图片描述

# -*- coding: utf-8 -*-

import gdal
import numpy as np
import cv2
def maxminImg(im):
    im=(im-np.min(im))/(np.max(im)-np.min(im))
    return np.uint8(im*255)
def getBGRim():
    gdal.AllRegister()
    dataset=gdal.Open(r"C:\Users\Y\Desktop\1.tif")
    b=dataset.GetRasterBand(1)
    b=b.ReadAsArray(0,0,dataset.RasterXSize,dataset.RasterYSize)
    g=dataset.GetRasterBand(2)
    g=g.ReadAsArray(0,0,dataset.RasterXSize,dataset.RasterYSize)
    r=dataset.GetRasterBand(3)
    r=r.ReadAsArray(0,0,dataset.RasterXSize,dataset.RasterYSize)
    b,g,r=maxminImg(b),maxminImg(g),maxminImg(r)
    return cv2.merge((b,g,r)),(b,g,r)
def fillhole(thresh):
    h,w=thresh.shape
    mask=np.zeros((h+2,w+2),np.uint8)
    holes=cv2.floodFill(thresh.copy(),mask,(0,0),255)
    s=~holes[1]
    return s|thresh
if __name__=="__main__":
    imout,t=getBGRim()
    b,g,r=t
    mask=b>(g+r)
    mask=np.uint8(mask*255)
    im2=imout&mask[:,:,np.newaxis]
    im3=cv2.cvtColor(im2,cv2.COLOR_BGR2GRAY)
    _,im4=cv2.threshold(im3,160,255,cv2.THRESH_BINARY)
    kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
    im5=cv2.dilate(im4,kernel,iterations=7)
    fill=fillhole(im5)
    _,cnts,_=cv2.findContours(fill,0,1)
    cnt_max=sorted(cnts,key=lambda x:cv2.contourArea(x))[-1]
    imout_temp=np.zeros((imout.shape[0],imout.shape[1]),np.uint8)
    cv2.drawContours(imout_temp,[cnt_max],0,(255,255,255),2)
    f2=fillhole(imout_temp)#skimage中的morphology.remove_small_holes用不了了,只能用笨办法
    result=imout & f2[:,:,np.newaxis]
    cv2.imwrite("result.jpg",result)
#    cv2.namedWindow("s",cv2.WINDOW_NORMAL),cv2.imshow("s",result),cv2.waitKey(0)

猜你喜欢

转载自blog.csdn.net/qq_15642411/article/details/83997237
今日推荐