精华内容
下载资源
问答
  • C++ 孔洞填充代码

    2019-08-26 11:01:56
    冈萨雷斯的数字图像处理孔洞填充方法运行缓慢,写了个简略的版本。文档附带测试图片
  • 对于一些图片来说,经过处理后的图片可能会出现一些孔洞的现象,影响图像地美观性,或者检测一些裂纹,会出现裂纹不连续,甚至出现断裂地现象,影响图像的效果,该代码就是解决这些断裂现象,使得图像变得连续。
  • 孔洞填充.py

    2017-10-20 17:58:47
    本工具使用的是python实现,主要的功能就是孔洞填充的实现。
  • 对于二值化图像,去除孔洞时采用的方法实际上与去除小区域相同,因此完全可以用同一个函数进行。 这两个功能可以采取区域生长法来实现。须注意,去除小区域时为保存有用信息,可采用8邻域探测,去除孔洞时则4邻域...
  • 形态学重建之孔洞填充

    千次阅读 多人点赞 2020-11-28 15:52:30
    白菜苗1、什么是膨胀(如果已经了解,请往下看)2、什么是孔洞填充(如果已经了解,请往下看)3、什么是形态学重建(如果已经了解,请往下看)4、什么是测地膨胀(如果已经了解,请往下看)5、什么是形态学重建之...

    如果你不小心又亦或是专门寻找形态学相关知识,那么很高兴能和你们分享这篇文章。

    首先,如果想了解形态学重建之孔洞填充原理,那么必须先了解什么是膨胀、什么是孔洞填充、什么是形态学重建、什么是测地膨胀,只有具备相关知识,我们才能把形态学重建之孔洞填充原理吃透。

    话不多说!!我们看看

    1、什么是膨胀(如果已经了解,请往下看)

    在这里插入图片描述
    这是来源于冈萨雷斯数字图像处理(第三版)的公式,如果光看字面晦涩难懂,那看看例子:

    在这里插入图片描述

    • 左边,是原图,一个边长 d d d的正方形,至于左上角的小正方形是用来膨胀画上去的。
    • 右边,变为膨胀后的一个边长 ( 1 8 + 1 + 1 8 ) d (\frac{1}{8} +1+\frac{1}{8})d 81+1+81d的正方形。

    那么怎么会这样呢?你可以这样理解,小正方形(即边长 d / 4 d/4 d/4的正方形)的中心可以在大的正方形里面运动,但是起不到膨胀效果,只有当它的中心点(即那个黑点)在边界运动时,是不是有 d / 8 d/8 d/8露在大正方形外面(看左边那个图),沿着边界绕一圈,是不是整个边长都会多了 d / 8 d/8 d/8其实中心思想就是取并集,只要我的中心点在大正方形以内(包括边界),凡是能包含的地方,就是我俩共有的地方(即膨胀后的图形)。

    在这里插入图片描述

    同理可得:

    在这里插入图片描述

    2、什么是孔洞填充(如果已经了解,请往下看)

    孔洞:一个孔洞可以被定义为由前景像素相连接的边界所包围的一个背景区域。(左到右依次是未填充,填充一部分、填充完毕)
    在这里插入图片描述
    在这里插入图片描述
    有点抽象是不是,其实它的意思就是先找孔洞的一个点,用结构元去膨胀,然后用原图像的补集进行约束(就是求个交集),不断重复膨胀,约束直至图形不改变(即收敛)就停止,与原图求个交集,孔洞就填上了,那我们看看如何填充的:( A A A原图, A c A^c Ac补集, B B B结构元,先在原图需要填充部分找一个点,进行膨胀)

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    到此,填充完毕,如果你还纠结,那么我们思路理一下,例如 X 1 X_1 X1为什么从第一张图变成第二张,是因为图1,是膨胀后的,还需要 A c A^c Ac补集约束一下,就是求个交集才是最后图形,其它以此类推,为什么到了 X 8 X_8 X8停下了呢,因为到这里已经收敛了,再膨胀也是 X 8 X_8 X8这张图形。
    在这里插入图片描述
    在这里插入图片描述

    3、什么是形态学重建(如果已经了解,请往下看)

    在这里插入图片描述

    在这里插入图片描述

    4、什么是测地膨胀(如果已经了解,请往下看)

    在这里插入图片描述
    测地膨胀,说白了,和前面的膨胀思想有点区别,前面的膨胀其实就是直接膨胀,测地膨胀呢?其实就是有条件的膨胀,怎么说,我们看看图:

    在这里插入图片描述
    一开始膨胀了是3*3个格子,中间那图,然后再跟模板 I c I^c Ic求个交集,那么就是测地膨胀的思想:先膨胀后约束(即求交集)。

    在这里插入图片描述
    哈哈哈哈,是不是以为测地膨胀结束了,其实不是,这只是第一步,后面不断重复迭代,直至收敛,就是前面说到为什么到 X 8 X_8 X8就停止是一样的,前一跟后一个一样就没必要继续了。

    在这里插入图片描述
    在这里插入图片描述

    5、什么是形态学重建之孔洞填充(终于到正题了)

    在这里插入图片描述
    首先, F ( x , y ) F(x,y) F(x,y)呢,其实求标记图像的方法,很简单,就是减去原始预想的边界值,其它地方为0,H则是我们要的结果。(看下图,对比下,是不是清楚点,边界取反,其它地方为0)

    在这里插入图片描述

    在这里插入图片描述

    如果懂了,继续往下:用3*3的结构元 B B B去膨胀F。

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    • 左1图为膨胀一次的结果,我们不是说了吗,测地膨胀的精髓在于,先膨胀,后约束,那么我们用 I c I^c Ic(原始图像 I I I的补集)约束下,得到最右边图。

    然后多次迭代。
    在这里插入图片描述
    在这里插入图片描述
    可以发现,其实图形迭代一次就收敛了(这图刚好凑巧,其它可能多次)

    在这里插入图片描述
    H是我们要的结果,那么左1图,就是H公式里面的函数, [ ] c []^c []c里面的其实就是补集的意思,所以对左1图取个补集就是H,细看,是不是填充好了。到此形态学重建之孔洞填充完成。

    6、实验

    代码:(非我所写:参见链接

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    
    img = cv.imread("text.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()
    

    结果:
    在这里插入图片描述
    我解释下,(从上开始数)src图为原始图,Mask为它的补集,Marker 0 为标记图像F,其实应该有白边框,估计像素小看不见,Marker为膨胀约束后的最后结果,dst为Marker补集图(即H),Holes图为 d s t ∩ M a s k \color{purple}{dst \cap Mask} dstMask,就是填充部分。

    对于结构元的选择不宜过大,不然填充不上。

    在这里插入图片描述
    明显发现 3 ∗ 3 3*3 33的结构元优于 7 ∗ 7 7*7 77的,(看下图)因为结构元过大,两个图像一样,取个补集就是原图 I I I,所以孔洞没填充上,所以选择结构元得适中。
    在这里插入图片描述

    到 此 结 束 , 希 望 能 帮 助 到 你 \color{maroon}{到此结束,希望能帮助到你}

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

    千次阅读 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
    展开全文
  • 工程代码下载传送门: 普遍的孔洞填充结果 孔洞定义为:被前景元素包围的后景的元素 虽然从定义上来看四周不被完全包围的元素不应该为孔洞,但是我还是想改善一下使周围这些(暂且称作伪孔洞)也被填充 ...

    工程代码下载传送门:https://download.csdn.net/download/jidxiaohuo/11827907

    普遍的孔洞填充结果
    在这里插入图片描述

    孔洞定义为:被前景元素包围的后景的元素
    虽然从定义上来看四周不被完全包围的元素不应该为孔洞,但是我还是想改善一下使周围这些(暂且称作伪孔洞)也被填充
    在这里插入图片描述

    展开全文
  • 本文主要介绍使用OpenCV对二值图做孔洞填充的方法与实现。 背景介绍 为什么要做孔洞填充?因为在部分情况下,二值图内部的孔洞和外部轮廓是一个整体,填充孔洞可以方便后续处理,减少干扰。 OpenCV孔洞填充的...

    点击上方“OpenCV与AI深度学习”,选择加"星标"或“置顶

    重磅干货,第一时间送达

    导读

    本文主要介绍使用OpenCV对二值图做孔洞填充的方法与实现。

    背景介绍

    为什么要做孔洞填充?因为在部分情况下,二值图内部的孔洞和外部轮廓是一个整体,填充孔洞可以方便后续处理,减少干扰。

    图片

    OpenCV孔洞填充的常用方法有2种:

    ① 形态学闭运算。闭运算是先膨胀后腐蚀操作,如上图,先膨胀白色高亮区域增加,孔洞会被填充。但使用闭运算针对不同的图片不能准确知道需要的核大小是多少,所以并不能通用;

    ② 轮廓绘制方法。通过轮廓绘制drawContours函数设置绘制线宽为-1即可填充绘制。但查找轮廓一般是在二值图处理之后才会使用,这样会造成重复操作。

    尽量在二值图时完成孔洞填充,不影响后续操作顺序才是最终目标!

    实现步骤与代码

    实现步骤:

    ① 通过二值化或其他方法得到二值图;

    ② 使用floodFill从(0,0)点开始执行漫水填充算法;

    ③ 漫水填充结果图取反;

    ④ 取反后的结果与二值图求并集。

    实现代码与逐步演示:

    展开全文
  • 形态学重建:孔洞填充的python实现

    千次阅读 多人点赞 2019-07-23 21:00:57
    基于形态学重建的孔洞填充应用。
  • 提出一种基于轮廓的孔洞填充算法。该算法首先查找目标区域的外围轮廓并添加标 记;然后将目标区域内一点作为种子点,以外围轮廓为界进行区域生长,直至找到目标区域 上的所有点;最后消除外围轮廓的标记,并将找到的目标...
  • opencv-python图像孔洞填充

    万次阅读 2018-11-24 16:26:09
      在进行图像分割的过程中,由于算法的不稳定或者图像质量的问题,会造成图像孔洞出现,这个时候就需要对图像中的孔洞进行填充,具体函数如下 def fillHole(im_in): im_floodfill = im_in.copy() # Mask used ...
  • 二值图像孔洞填充

    2020-06-04 14:22:07
    二值图像孔洞填充 原理 将原图像向外延展一到两个像素,并将值填充为0。 使用floodFill函数将扩展后图像的大背景填充,填充值为前景色255,种子点为(0,0)即可(步骤一可以确保(0,0)点位于大背景。 将填充...
  • 孔洞填充及连通分量提取

    千次阅读 2018-05-24 21:03:49
    一、 目的(1) 实现孔洞填充;(2) 实现连通分量的提取并计算连通分量的个数及每个连通分量的像素数。二、 代码思路(1)孔洞填充:先选取十字形结构作为结构元;接着生成一个由0组成的阵列X,大小与二值图像A...
  • //漫水填充填充 从0,0开始,有空洞的地方用255代替 Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\lager_1.jpg", lager); Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\lager1_1.jpg...
  • 孔洞定义:被前景(白色)连通域包围的封闭的背景(黑色)区域,不限于圆形。如图所示。 原理:以原图像的补集作为Mask,用来限制膨胀结果;以带有白色边框的黑色图像为初始Marker,用SE对其进行连续膨胀,直至收敛...
  • Python-基于OpenCV的轮廓填充 泛洪算法 孔洞填充

    千次阅读 多人点赞 2021-04-03 21:19:40
    孔洞填充就是在二值化下,图像中出现了“白点”或者“黑点”,这会影响我们计算轮廓里面的面积计算! 孔洞填充在这里我们针对的是二值图,并不是灰度图! 在OpenCV中实现imfill的步骤 阅读以下步骤时请参考下图. ...
  • 形态学之孔洞填充

    万次阅读 2018-10-06 20:00:49
    说实话,我第一次看到这只是明白了它的原理,但是对它的作用并不是很了解,在做过一些图像...孔洞填充的公式:Xk=(Xk−1⊕B)∩Ack=1,2,3...X_k=(X_{k-1}\oplus B)\cap A^c \qquad k=1,2,3...Xk​=(Xk−1​⊕B)∩Ack...
  • C++ Opencv imfill 孔洞填充函数的实现函数实现的中心思想二值图寻找连通域的关键种子点的确定连通域的寻找过程条件设定最后赋值话不多说 直接上函数代码主函数代码代码框截图实例图片运行结果 函数实现的中心思想 ...
  • %先进行孔洞操作,再进行膨胀操作 %对复杂的图片效果好,而且要调试IBW=BW;或者IBW=~BW;看哪个更适合 I = imread('picture16.jpg'); BW=im2bw(I,0.4); IBW=~BW; F1 = imfill(IBW,'holes');SE = ones(3);F2 = ...
  • 今天我们就用python语言基于OpenCV实现孔洞填充。 代码实现: import cv2; import numpy as np; ''' 图像说明: 图像为二值化图像,255白色为目标物,0黑色为背景 要填充白色目标物中的黑色空洞 ''' def FillHole...
  • Canny边缘检测+孔洞填充

    千次阅读 2019-04-16 11:01:36
    使用C++、opencv进行边缘检测+空洞填充 相关重要API: Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1)); getStructuringElement函数会返回指定形状和尺寸的结构元素,返回...
  • 一、孔洞填充 基本思想: 基于形态学算法,膨胀后与上取反的原图 算法实现步骤: 1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞 2.新建一张全零图,用0表示背景,1表示前景,...
  • matlab imfill孔洞填充

    万次阅读 2018-08-14 20:19:45
    作用填充二值图像BW中的空洞   clear all; clc; close all; img = imread('test1.png'); if ndims(img)==3  img = rgb2gray(img); end img_bw = im2bw(img); img_fill = imfill(img_bw, 'holes'); ...
  • 做项目需要对灰度图像进行空洞填充,但是网上全都是关于灰度图像的空洞填充,我的图像内容包含重要信息,所以不能转化为灰度图像. 代码如下: import numpy as np import scipy as sp import scipy.ndimage def ...
  • fill_up (Region, RegionFillUp) #include "iostream" #include <opencv2\opencv.hpp> using namespace std; using namespace cv; Mat inv_board(Mat src); Mat inv_img(Mat src); void delarea(Mat&... M
  • 本文将介绍OpenCVSharp应用实例--二值图孔洞填充方法与实现! 具体实现步骤可以参考博客介绍:https://blog.csdn.net/stq054188/article/details/119857153 里面是Python和C++代码实现,这里转为C# OpenCVSharp...
  • 孔洞填充结果:  源码 #include <cv.h> #include <highgui.h> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <vector> using ...
  • 提出了一种对任意形状物体都适用的基于区域外接矩形的孔洞填充算法,与传统的区域填充算法相比较,该算法填充速度快、实用性强,因而可应用于图形及图像处理的诸多领域。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,525
精华内容 610
关键字:

孔洞填充