精华内容
下载资源
问答
  • 最后对Marker取补即得到最终图像,与原图相减可得到填充图像。 import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread("C:/Users/xiaomao/Desktop/test.jpg") # 二值化 imgray...

            孔洞定义:被前景(白色)连通域包围的封闭的背景(黑色)区域,不限于圆形。如图所示。
            原理:以原图像的补集作为Mask,用来限制膨胀结果;以带有白色边框的黑色图像为初始Marker,用SE对其进行连续膨胀,直至收敛;最后对Marker取补即得到最终图像,与原图相减可得到填充图像。

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    
    img = cv.imread("C:/Users/xiaomao/Desktop/test.jpg")
    
    # 二值化
    imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    imgray[imgray < 100] = 0
    imgray[imgray >= 100] = 255
    
    # 原图取补得到MASK图像
    mask = 255 - imgray
    
    # 构造Marker图像
    marker = np.zeros_like(imgray)
    marker[0, :] = 255
    marker[-1, :] = 255
    marker[:, 0] = 255
    marker[:, -1] = 255
    marker_0 = marker.copy()
    
    # 形态学重建
    SE = cv.getStructuringElement(shape=cv.MORPH_CROSS, ksize=(3, 3))
    while True:
        marker_pre = marker
        dilation = cv.dilate(marker, kernel=SE)
        marker = np.min((dilation, mask), axis=0)
        if (marker_pre == marker).all():
            break
    dst = 255 - marker
    filling = dst - imgray
    
    # 显示
    plt.figure(figsize=(12, 6))  # width * height
    plt.subplot(2, 3, 1), plt.imshow(imgray, cmap='gray'), plt.title('src'), plt.axis("off")
    plt.subplot(2, 3, 2), plt.imshow(mask, cmap='gray'), plt.title('Mask'), plt.axis("off")
    plt.subplot(2, 3, 3), plt.imshow(marker_0, cmap='gray'), plt.title('Marker 0'), plt.axis("off")
    plt.subplot(2, 3, 4), plt.imshow(marker, cmap='gray'), plt.title('Marker'), plt.axis("off")
    plt.subplot(2, 3, 5), plt.imshow(dst, cmap='gray'), plt.title('dst'), plt.axis("off")
    plt.subplot(2, 3, 6), plt.imshow(filling, cmap='gray'), plt.title('Holes'), plt.axis("off")
    plt.show()
    
    

     

    原图
    过程及结果图

     

    展开全文
  • 今天我们就用python语言基于OpenCV实现孔洞填充。 代码实现: import cv2; import numpy as np; ''' 图像说明: 图像为二值化图像,255白色为目标物,0黑色为背景 要填充白色目标物中的黑色空洞 ''' def FillHole...

    我们在进行图像分割后,分割图像结果有时会有一些小孔洞,如下图所示。今天我们就用python语言基于OpenCV实现孔洞填充。
    有孔洞的分割图像
    代码实现:

    import cv2;
    import numpy as np;
    
    '''
    图像说明:
    图像为二值化图像,255白色为目标物,0黑色为背景
    要填充白色目标物中的黑色空洞
    '''
    def FillHole(imgPath,SavePath):
        im_in = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE);
    
        # 复制 im_in 图像
        im_floodfill = im_in.copy()
        
        # Mask 用于 floodFill,官方要求长宽+2
        h, w = im_in.shape[:2]
        mask = np.zeros((h+2, w+2), np.uint8)
        
        # floodFill函数中的seedPoint必须是背景
        isbreak = False
        for i in range(im_floodfill.shape[0]):
            for j in range(im_floodfill.shape[1]):
                if(im_floodfill[i][j]==0):
                    seedPoint=(i,j)
                    isbreak = True
                    break
            if(isbreak):
                break
        # 得到im_floodfill
        cv2.floodFill(im_floodfill, mask, seedPoint, 255);
    
        # 得到im_floodfill的逆im_floodfill_inv
        im_floodfill_inv = cv2.bitwise_not(im_floodfill)
        # 把im_in、im_floodfill_inv这两幅图像结合起来得到前景
        im_out = im_in | im_floodfill_inv
         
        # 保存结果
        cv2.imwrite(SavePath, im_out)
        
    

    孔洞填充结果如下:
    孔洞填充结果图像

    附:rgb图像填充孔洞
    https://blog.csdn.net/weixin_42181588/article/details/89467590

    展开全文
  • 图像处理——孔洞填充算法

    千次阅读 2020-08-28 15:06:48
    3、最后对Marker取补即得到最终图像,与原图相减可得到填充图像。 python代码: # -*- coding:utf-8 -*- import numpy as np import cv2 class kdtc(): def __init__(self): pass def readTif(sel

    前言:
    由于遥感图像通常巨大,opencv自带的imread函数可能读取图像失败,所以用gdal库写个readTif函数;自带的floodfill函数运行会时间太久,所以也自己写叭。。。
    先看一下需求:
    在这里插入图片描述算法流程:
    1、以原图像的补集作为Mask,用来限制膨胀结果;
    2、以带有白色边框的黑色图像为初始Marker,用SE对其进行连续膨胀,直至收敛;
    3、最后对Marker取补即得到最终图像,与原图相减可得到填充图像。
    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
    
    展开全文
  • 今天我们就用python语言基于OpenCV实现孔洞填充。 代码实现: import cv2; import numpy as np; def FillHole_RGB(imgPath,SavePath): # 读取图像为uint32,之所以选择uint32是因为下面转为0xbbggrr不溢出 im_in_...

    我们在进行图像分割后,分割图像结果有时会有一些小孔洞,如下图所示。今天我们就用python语言基于OpenCV实现孔洞填充。
    含有孔洞的RGB图像
    代码实现:

    import cv2;
    import numpy as np;
    
    def FillHole_RGB(imgPath,SavePath):
        # 读取图像为uint32,之所以选择uint32是因为下面转为0xbbggrr不溢出
        im_in_rgb = cv2.imread(imgPath).astype(np.uint32)
        
        # 将im_in_rgb的RGB颜色转换为 0xbbggrr
        im_in_lbl = im_in_rgb[:,:,0] + (im_in_rgb[:,:,1] << 8) + (im_in_rgb[:,:,2] << 16)
        
        # 将0xbbggrr颜色转换为0,1,2,...
        colors, im_in_lbl_new = np.unique(im_in_lbl, return_inverse=True)
    
        # 将im_in_lbl_new数组reshape为2维
        im_in_lbl_new = np.reshape(im_in_lbl_new,im_in_lbl.shape)
        
        # 创建从32位im_in_lbl_new到8位colorize颜色的映射
        colorize = np.empty((len(colors), 3), np.uint8)
        colorize[:,0] = (colors & 0x0000FF)
        colorize[:,1] = (colors & 0x00FF00) >> 8
        colorize[:,2] = (colors & 0xFF0000) >> 16
        
        # 输出一下colorize中的color
        print("Colors_RGB: \n",colorize)
        
        # 有几种颜色就设置几层数组,每层数组均为各种颜色的二值化数组
        im_result = np.zeros((len(colors),)+im_in_lbl_new.shape,np.uint8)
        
        # 初始化二值数组
        im_th = np.zeros(im_in_lbl_new.shape,np.uint8)
        
        for i in range(len(colors)):
            for j in range(im_th.shape[0]):
                for k in range(im_th.shape[1]):
                    if(im_in_lbl_new[j][k]==i):
                        im_th[j][k] = 255
                    else:
                        im_th[j][k] = 0
            # 复制 im_in 图像
            im_floodfill = im_th.copy()
         
            # Mask 用于 floodFill,官方要求长宽+2.
            h, w = im_th.shape[:2]
            mask = np.zeros((h+2, w+2), np.uint8)
            
            isbreak = False
            for m in range(im_floodfill.shape[0]):
                for n in range(im_floodfill.shape[1]):
                    if(im_floodfill[m][n]==0):
                        seedPoint=(m,n)
                        isbreak = True
                        break
                if(isbreak):
                    break
                    
            # 得到im_floodfill
            cv2.floodFill(im_floodfill, mask, seedPoint, 255);
             
            # 得到im_floodfill的逆im_floodfill_inv
            im_floodfill_inv = cv2.bitwise_not(im_floodfill)
             
            # 把im_in、im_floodfill_inv这两幅图像结合起来得到前景
            im_out = im_th | im_floodfill_inv
            im_result[i] = im_out
        
        # rgb结果图像
        im_fillhole = np.zeros((im_in_lbl_new.shape[0],im_in_lbl_new.shape[1],3),np.uint8)
        
        # 之前的颜色映射起到了作用
        for i in range(im_result.shape[1]):
            for j in range(im_result.shape[2]):
                for k in range(im_result.shape[0]):
                    if(im_result[k][i][j] == 255):
                        im_fillhole[i][j] = colorize[k]
                        break
        
        # 保存图像
        cv2.imwrite(SavePath, im_fillhole)
    

    孔洞填充结果如下:
    在这里插入图片描述

    展开全文
  • 二值图像孔洞填充

    万次阅读 2017-10-04 17:14:21
    二值图像的孔洞填充是基于图像形态学操作的基本运算,本文参考数字图像处理(冈萨雷斯著)相关章节的有关内容并结合作者自己的思考,给出了基于C# 二值图像孔洞填充的可行程序。 基础知识:参考数字图像处理 P402-P...
  • opencv实现二值图像孔洞填充

    万次阅读 2018-04-22 11:45:37
    matlab中的imfill函数可以方便得实现...使用形态学重建的算法能够有效地实现孔洞填充,具体算法参照《数字图像处理》第三版9.5.9节,孔洞填充。 主要实现代码如下所示:其中imfill函数即为空洞填充的实现函数,第一...
  • C++ 孔洞填充代码

    2019-08-26 11:01:56
    冈萨雷斯的数字图像处理孔洞填充方法运行缓慢,写了个简略的版本。文档附带测试图片
  • 在进行孔洞填充时,对像素(x,y)周围的八连通区域进行判断,具体步骤为:  (1)首先将原图拷贝到缓存中,然后用以待填充的像素点(x,y)为中心的3x3的块对整幅图像进行扫描,并用计数器记录下这个块所覆盖的9个点中...
  • 形态学重建有很宽的实际应用领域,下面有三个关于文本图像的二值图像的形态学处理实验,分别是提取较长的字符,填充孔洞和边缘字符消除。 提取长字符 这里先给出主函数,具体功能函数后面给出: %% 运行 main_zifu.m...
  • 一、孔洞填充 基本思想: 基于形态学算法,膨胀后与上取反的原图 算法实现步骤: 1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞 2.新建一张全零图,用0表示背景,1表示前景,...
  • Scipy.ndimage--孔洞填充(多维图像

    千次阅读 2019-03-13 13:58:41
    本节重点介绍形态学处理---孔洞填充 填充二进制图像矩阵中的孔洞 scipy.ndimage.binary_fill_holes(input,structure=None,output=None,origin=0) 描述:填充二进制图像矩阵中的孔洞 参数: input:类型:array...
  • ![图片说明](https://img-ask.csdn.net/upload/201707/04/1499135081_893802.png) ![图片说明]... 这个公式,我理解不了,还有包含A阵列大小我感觉很模糊,请教大神解答下。
  • 今天我们就用python语言基于OpenCV实现孔洞填充。图1 有孔洞的分割图像我们要用到的函数是OpenCV里的floodFill函数。使用floodFill函数可以得到只标记孔洞的像素矩阵(孔洞值为0,非孔洞值为指定值)。有了...
  • 今天我们就用python语言基于OpenCV实现孔洞填充。图1 有孔洞的分割图像我们要用到的函数是OpenCV里的floodFill函数。使用floodFill函数可以得到只标记孔洞的像素矩阵(孔洞值为0,非孔洞值为指定值)。有了...
  • 一、 前言卷积神经网络(convolutional neural network,CNN)是一种专门用来处理网格结构数据(例如图像数据)的前馈神经网络,是由生物学家Hubel和Wiesel在早期关于猫脑视觉皮层的研究发展而来。Hubel和Wiesel通过对猫...
  • 因为左边的图片存在很多噪声点,直接根据阈值去填充会存在问题,所以我就先对图片进行了一次二值化处理,然后调用了opencv的fillPoly函数完成孔洞填充。 import cv2 import os import numpy as np imaPath = r"E:...
  • 感谢原文作者,写的很好。原文地址:...。。Keywords: 二值图像,形态学,击中,边界提取,孔洞填充,...
  • 形态学之孔洞填充

    千次阅读 2018-10-06 20:00:49
    说实话,我第一次看到这只是明白了它的原理,但是对它的作用并不是很了解,在做过一些图像处理后,终于明白了它的重要之处,这里重新将其作复习,并写在这里,方便自己以后复习(不用翻书,翻书真的很麻烦) ...
  • 在平时处理二值图像的时候,除了要进行形态学的一些操作,还有有上一节讲到的轮廓连通区域的面积周长标记等,还有一个最常见的就是孔洞填充,opencv这里成为漫水填充,其实也可以叫种子填充,或者区域生长,基本的...

空空如也

空空如也

1 2 3 4 5
收藏数 96
精华内容 38
关键字:

图像处理孔洞填充