画像処理-穴埋めアルゴリズム

はじめに:
リモートセンシング画像は通常巨大であるため、opencvに付属のimread関数は画像の読み取りに失敗する可能性があるため、gdalライブラリを使用してreadTif関数を記述します。組み込みのfloodfill関数は実行に時間がかかりすぎるため、自分でも記述します。最初に
要件を確認します。
ここに写真の説明を挿入アルゴリズムフロー:
1。元の画像の補数をマスクとして
使用して展開結果を制限します。2。白い境界線のある黒い画像を初期マーカーとして使用し、SEを使用して収束するまで継続的に展開します。
3.最後に、マーカーを補完して最終画像を取得し、元の画像を差し引いて塗りつぶされた画像を取得できます。
pythonコード:

# -*- coding:utf-8 -*-
import numpy as np
import cv2

class kdtc():
    def __init__(self):
        pass

    def readTif(self,fileName):
        import gdal
        dataset = gdal.Open(fileName)
        if dataset == None:
            print(fileName+"文件无法打开")
            return
        im_width = dataset.RasterXSize #栅格矩阵的列数
        im_height = dataset.RasterYSize #栅格矩阵的行数
        im_bands = dataset.RasterCount #波段数
        im_data = dataset.ReadAsArray(0,0,im_width,im_height)#获取数据
        im_geotrans = dataset.GetGeoTransform()#获取仿射矩阵信息
        im_proj = dataset.GetProjection()#获取投影信息
        im_blueBand =  im_data[2,0:im_height,0:im_width]#获取蓝波段
        im_greenBand = im_data[1,0:im_height,0:im_width]#获取绿波段
        im_redBand =   im_data[0,0:im_height,0:im_width]#获取红波段
        #im_nirBand = im_data[3,0:im_height,0:im_width]#获取近红外波段
        im_data = cv2.merge([im_blueBand, im_greenBand, im_redBand])
        #print(type(im_data))
        return im_data

    def kongdongtianchong(self,img_name,TF=True):
        img = self.readTif(img_name)
        img = img[:, :, 0]
        if TF:
            se0 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (30, 30))
            img = cv2.dilate(img, se0)
            mask = 255 - img
            
			# 构造Marker
			#marker = np.zeros_like(img)
    		#marker[0, :] = 255
    		#marker[-1, :] = 255
   			#marker[:, 0] = 255
    		#marker[:, -1] = 255
    		#marker_0 = marker.copy()
    		
            # 构造Marker
            SE=cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (50, 50))
            marker=cv2.erode(mask,SE)

            # 形态学重建
            se = cv2.getStructuringElement(shape=cv2.MORPH_CROSS, ksize=(25, 25))
            while True:
                marker_pre = marker
                dilation = cv2.dilate(marker, kernel=se)
                marker = np.min((dilation, mask), axis=0)
                if (marker_pre == marker).all():
                    break
            dst = 255 - marker
            dst=cv2.erode(dst,se0)
            print('----------孔洞填充完成----------')
            return dst
        else:
            return img

おすすめ

転載: blog.csdn.net/qq_42823043/article/details/108279767