精华内容
下载资源
问答
  • 在本教程中,我们将学习如何...因此,我们使用简单图像阈值处理将边界与背景分开。换句话说,我们说强度高于特定值(阈值)像素是背景,其余像素是前景。上示中间图像显示此阈值图像(黑色代表背景,白色代表...

    在本教程中,我们将学习如何填充二进制图像中的孔。考虑一下图1左侧的图像。假设我们想找到一个二进制蒙版,它将硬币与背景分离开,如右图所示。在本教程中,包含硬币的圆形区域也称为前景。

    CSDN图标

    请注意,硬币的边界很暗,与白色背景不同。因此,我们使用简单的图像阈值处理将边界与背景分开。换句话说,我们说强度高于特定值(阈值)的像素是背景,其余像素是前景。上示中间图像显示此阈值图像(黑色代表背景,白色代表前景)。不幸的是,即使边界已被很好地提取(纯白色),硬币的内部强度也与背景相似。因此,阈值操作无法将其与背景区分开。我们如何用白色填充圆形边界内的所有像素?

    MATLAB具有称为imfill的功能,该功能允许您填充孔,并且可以按以下方式使用它。

    % MATLAB code for filling holes in a binary image. 
    im = imfill(im,'holes');
    

    OpenCV中的imfill

    OpenCV中没有插入功能,但是我们可以肯定地写一个!这个想法很简单。我们知道像素(0,0)连接到背景。因此,我们可以通过简单地从像素(0,0)进行泛洪操作来提取背景。不受泛洪操作影响的像素必须在边界内。反转并与阈值图像组合时,充满洪水的图像将提供前景遮罩!
    在这里插入图片描述

    用C ++代码填充二进制图像中的孔

    具体代码如下:

    #include "opencv2/opencv.hpp"
    
    using namespace cv;
    
    int main(int argc, char **argv)
    {
    	// Read image
    	Mat im_in = imread("nie.png", IMREAD_GRAYSCALE);
    
    
    	// Threshold.
    	// Set values equal to or above 220 to 0.
    	// Set values below 220 to 255.
    	Mat im_th;
    	threshold(im_in, im_th, 220, 255, THRESH_BINARY_INV);
    
    	// Floodfill from point (0, 0)
    	Mat im_floodfill = im_th.clone();
    	floodFill(im_floodfill, cv::Point(0, 0), Scalar(255));
    
    	// Invert floodfilled image
    	Mat im_floodfill_inv;
    	bitwise_not(im_floodfill, im_floodfill_inv);
    
    	// Combine the two images to get the foreground.
    	Mat im_out = (im_th | im_floodfill_inv);
    
    	// Display images
    	imshow("Thresholded Image", im_th);
    	imshow("Floodfilled Image", im_floodfill);
    	imshow("Inverted Floodfilled Image", im_floodfill_inv);
    	imshow("Foreground", im_out);
    	waitKey(0);
    
    }
    

    其他技术

    还有其他方法可以解决相同的问题。一种方法是使用形态学闭运算。但是,要进行形态学操作,您需要知道孔的最大尺寸。另一种方法是使用findContours查找轮廓,然后使用drawContours填充轮廓。我更喜欢本文中描述的技术的简单性和速度。

    展开全文
  • 在本教程中,我们将学习如何填充二值图像中孔。考虑下左侧图像。假设我们想要找到一个二值掩模,它将硬币与背景分开,如下右侧图像所示。...上图中间图像显示通过阈值分割获得图像(黑色代表背景...

    在本教程中,我们将学习如何填充二值图像中的孔。考虑下图左侧的图像。假设我们想要找到一个二值掩模,它将硬币与背景分开,如下图右侧图像所示。在本教程中,包含硬币的圆形区域也将被称为前景。

    请注意,硬币的边界是黑色的,与白色背景不同。因此,我们使用简单的图像阈值来将边界与背景分开。换句话说,我们说强度高于某个值(阈值)的像素是背景,其余像素是前景。上图中间图像显示通过阈值分割获得图像(黑色代表背景,白色代表前景)。不幸的是,即使边界被很好地提取(它是纯白色),硬币的内部也具有与背景类似的强度。因此,阈值操作不能将其与背景分开。我们如何用白色填充圆形边界内的所有像素?然后将其分开。

    1 imfill in OpenCV

    MATLAB有一个名为imfill的函数 ,可以让你填充孔洞。OpenCV中没有imfill功能,但我们肯定可以写一个!我们知道像素点(0,0)连接到背景。因此,我们可以通过从像素(0,0)执行填充操作来提取背景。不受漫水填充操作影响的像素必然位于边界内。阈值图像与漫水填充图像或非运算后图像为前景掩模!

    漫水填充算法是用来标记一片区域的:设置一个种子点,然后种子点附近的相似点都被填充同一种颜色。该算法应用性很广,比如目标识别,photoshop 的魔术棒功能等等,是填充类算法中应用最为广泛的一个算法。漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点。其中掩膜Mask用于进一步控制那些区域将被填充颜色。漫水填充在OpenCV中通过floodfill函数实现,具体见:

    https://blog.csdn.net/qq_37385726/article/details/82313004

    在OpenCV中实现imfill结果类似下图,步骤如下:

    1)读取图像,并转换为灰度图像,如下图1所示;

    2)对输入图像进行阈值分割以获得二值图像,如下图2所示;

    3)对于阈值分割后的图像进行漫水填充,从像素(0,0)填充颜色。请注意,步骤2和步骤3的输出之间的差异在于步骤3中的背景现在是白色的,如下图3所示。

    4)反转漫水填充后的图像(即黑色变为白色,白色变为黑色),如下图4所示。

    5)使用按位OR运算将阈值图像与反向漫水填充图像组合以获得填充有孔的最终前景掩模。步骤4中的图像在边界内具有一些黑色区域。根据设计,步骤2中的图像填充了这些孔。因此,我们将两者结合起来获得掩模,如下图5所示。

    2 完整代码

    还有其他方法可以解决同样的问题。一种方法是使用形态学闭运算操作。但是,要进行形态学操作,您需要知道孔的最大尺寸。另一种方法是使用findContours查找轮廓,然后使用drawContours填充它。我更喜欢这篇文章中所描述的技术的简单性和速度。

    本文所有代码见:

    https://github.com/luohenyueji/OpenCV-Practical-Exercise

    C++:

    #include "pch.h"
    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    
    int main()
    {
        // Read image 读取图像
        Mat im_in = imread("./image/nickel.jpg", IMREAD_GRAYSCALE);
    
      
        // Threshold.
        // Set values equal to or above 220 to 0.
        // Set values below 220 to 255.
    	//阈值分割
        Mat im_th;
        threshold(im_in, im_th, 220, 255, THRESH_BINARY_INV);
        
        // Floodfill from point (0, 0) 以点(0,0)为种子点,进行漫水填充
        Mat im_floodfill = im_th.clone();
        floodFill(im_floodfill, cv::Point(0,0), Scalar(255));
        
        // Invert floodfilled image 反转图像
        Mat im_floodfill_inv;
        bitwise_not(im_floodfill, im_floodfill_inv);
        
        // Combine the two images to get the foreground. 获得前景
        Mat im_out = (im_th | im_floodfill_inv);
    
        // Display images 图像展示
        imshow("Thresholded Image", im_th);
        imshow("Floodfilled Image", im_floodfill);
        imshow("Inverted Floodfilled Image", im_floodfill_inv);
        imshow("Foreground", im_out);
        waitKey(0);
    	return 0;
    }

    python:

    #!/usr/bin/env python
    
    import cv2;
    import numpy as np;
    
    # Read image
    im_in = cv2.imread("./image/nickel.jpg", cv2.IMREAD_GRAYSCALE);
    
    # Threshold.
    # Set values equal to or above 220 to 0.
    # Set values below 220 to 255.
    
    th, im_th = cv2.threshold(im_in, 220, 255, cv2.THRESH_BINARY_INV);
    
    # Copy the thresholded image.
    im_floodfill = im_th.copy()
    
    # Mask used to flood filling.
    # Notice the size needs to be 2 pixels than the image.
    h, w = im_th.shape[:2]
    mask = np.zeros((h+2, w+2), np.uint8)
    
    # Floodfill from point (0, 0)
    cv2.floodFill(im_floodfill, mask, (0,0), 255);
    
    # Invert floodfilled image
    im_floodfill_inv = cv2.bitwise_not(im_floodfill)
    
    # Combine the two images to get the foreground.
    im_out = im_th | im_floodfill_inv
    
    # Display images.
    cv2.imshow("Thresholded Image", im_th)
    cv2.imshow("Floodfilled Image", im_floodfill)
    cv2.imshow("Inverted Floodfilled Image", im_floodfill_inv)
    cv2.imshow("Foreground", im_out)
    cv2.waitKey(0)

    3 参考

    https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

    展开全文
  • 最小割算法是图论中一个概念,其作用是以某种方式,将两个点分开,当然这两个点中间可能是通过无数点再相连一 此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向G=<V...

    背景知识:
    最小割算法是图论中的一个概念,其作用是以某种方式,将两个点分开,当然这两个点中间可能是通过无数的点再相连的。
    图一 在这里插入图片描述
    此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向图G=<V,E>表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。
    此处的Graph和普通的Graph稍有不同。普通的图分为有向图和无向图;由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。
    GraphCuts图在普通图的基础上多了2个顶点,这2个顶点分别用符号**”S””T”**表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边。
    第一种顶点和边是:第一种普通顶点对应于图像中的每个像素。每两个邻域顶点(对应于图像中每两个邻域像素)的连接就是一条边。这种边也叫n-links。
    第二种顶点和边是:除图像像素外,还有另外两个终端顶点,叫S(source:源点,取源头之意)和T(sink:汇点,取汇聚之意)。每个普通顶点和这2个终端顶点之间都有连接,组成第二种边。这种边也叫t-links。

    参考文章

    pcl中的最小图割:

    pcl官方文档中把点云最小图割算法分成了三个步骤:
    1、构造GraphCut图在这里插入图片描述
    意译:对于一个给出的点云,算法会以点云中每一个点,另加一个source(源点)、一个sink(汇点),作为GraphCut图的顶点;点云中每个点与其近邻连线所形成的边叫n-links,与sink、source连线形成的边叫t-links。

    2、给每条边赋予权重
    参考官方文档:在这里插入图片描述
    3、分割

    *问题一:顶点和边有哪几种,怎么来的?
    顶点:点云中的每个点、source(源点)、sink(汇点)
    边: n-link、t-link
    “怎么来的” 参考步骤1,清楚的很呐

    source和sink是怎么来的?是什么?
    图一就是一个图像对应的s-t图,每个像素对应图中的一个相应顶点,另外还有 S 和 T 两个顶点。上图有两种边,实线的边表示每两个邻域普通顶点连接的边n-links,虚线的边表示每个普通顶点与s和t连接的边t-links。在前后景分割中,S一般表示前景目标,T一般表示背景。”
    这个最小割把图的顶点划分为两个不相交的子集S和T,其中s
    ∈S,t∈ T和S∪T=V。这两个子集就对应于图像的前景像素集和背景像素集,那就相当于完成了图像分割。
    ——引用第一个链接中的描述
    也就是说, S、T一开始是点,在后续的算法进行过程中,不断有新的点被归类为foreground、background的点加入到S、T中,形成了后来的前景像素集和背景像素集,对应点云分割中的目标物体背景

    展开全文
  • 在做图过程中图像要产生移位,为了使图像不在移位过程中出现白边,在Photoshop中要将图像的背景变大一些。 四、特殊画现的设计制作: 1、带变画、动画的立体的设计:要做变画的图案的各种状态调好,分别放在不同的...
  • cocos2dx 3.6 屏幕适配

    2017-02-17 13:41:59
    (1)第一种做法是把背景跟UI分开背景手动放大,使背景超出屏幕位置。(做背景图片时应该把主要像素集中在背景的中心位置) (2)第二种做法------ 拿宽度适配来举例: 因为是宽度适配,所以宽度会正好占满屏幕,...

    1: 用一个设计分辨率来匹配不同的资源
    直接修改setFrameSize
    2:用一套资源来适配不同的设计分辨率


    1: 背景适配

    (1)第一种做法是把背景跟UI分开,背景手动放大,使背景超出屏幕位置。(做背景图片时应该把主要像素集中在背景的中心位置)

    (2)第二种做法------ 拿宽度适配来举例:

    因为是宽度适配,所以宽度会正好占满屏幕,此时可以把整个高度分成三部分来解决(把背景图片分出三张图)。  上--- 中----下,上面的图片拿代码固定在屏幕的最上方,下面的图片固定在屏幕的最下方,然后中间区域手动缩放比例。  此种做法优于第一种,不同手机比例看上去效果相同,但美术需要把一张背景图切割成三张。

    2:UI适配

    (1)第一种做法是UI全部拿代码写,可手动实现适配

    (2)第二种做法是UI先拿cocos studio拼好,然后拿代码调整按钮的位置。


    适配代码如下 : 

    void AppDelegate::adaptPhone(GLView *glview)
    {
    	// 1920/1080 = 16:9 = 1.78   16:10 -> 16:9         16:12 -> 16:9
    	//  1280/800 = 16:10 = 1.6  所以如果宽度适配,高度显示不全   如果高度适配,宽度会有黑边
    	//资源大小
    	Size resSize = AppDelegate::designSize;//1136, 768为美术出图的尺寸
    	//屏幕大小
    	auto winSize = Director::getInstance()->getWinSize();
    	//x缩放比例
    	float widthScale = winSize.width / resSize.width;
    	//y缩放比例
    	float heightScale = winSize.height / resSize.height;
    
    
    	//背景图片 1136,768
    
    
    	if (widthScale > heightScale)// <
    	{
    		//1432,800  所有坐标都是相对于这个分辨率
    		glview->setDesignResolutionSize(resSize.width, resSize.height, ResolutionPolicy::FIXED_HEIGHT);
    	}
    	else
    	{
    		//1280,720  所有坐标都是相对于这个分辨率
    		glview->setDesignResolutionSize(resSize.width, resSize.height, ResolutionPolicy::FIXED_WIDTH);
    	}
    
    
    	//高度适配 -----1136,768会自动缩放成 1366,768
    	auto size = glview->getDesignResolutionSize();
    	log("");
    }
    参考链接: 

    http://www.zaojiahua.com/adaptation.html

    http://blog.csdn.net/chinahaerbin/article/details/39586281

    http://www.tairan.com/archives/4018/


    展开全文
  • 背景:透明隔是垂直双膜,从call体下表面延伸到穹ni。 腔静脉隔膜(CSP)是在两个膜之间形成腔,将透明隔膜与侧脑室前角分开。 腔静脉(CV)是call体脾后两个小叶之间腔延伸。 另外,在囊状前庭和松果体...
  • 我们需要准备tab左面背景和中右部背景图片(不过我个人偏向于把中间的背景和右边的背景分开,我认为那样可以实现中部背景循环,就算文字长一米也无所谓了,不过这太夸张了,考虑中国没有哪个菜单文字会超过6个字,...
  • 游戏UI规范

    2019-02-25 22:39:00
    1、 背景1和背景2分开切,可以组合成各种不同面包背景图 2、 背景1和背景2在没有花纹情况下,中间纯色部分切4个像素做就公共个缩放就可以了,无需切这么大,没渐变和花纹都用九宫格缩放。 3、左右对称...
  • 本文实例为大家分享了vue组件实现移动端九宫格转盘抽奖具体代码,供大家参考,具体内容如下 ...中间的按钮用是css3animation,我这个奖品是合在了一张上,你也可以分开成8张小,那样需要写更多样式。 //
  • 本文主要记录一些零碎的东西 主要记录android 下 全屏界面时 软键盘弹出后布局移动的解决方案 先看看正常的布局(hellword文字在屏幕正中间) ...布局文件 背景和需要移动的控件肯定是需要分开的 xm
  • 界面与逻辑分开,让程序员有更多时间去进行软件内部逻辑处理。SkinSE没有采用传统HOOK修改窗口过程函数方式 ,而是只是针对具体窗口进行界面处理。SkinSE只用到了windows几个底层核心库,没有用到(MFC/ATL...
  • HTML,CSS制作写轮眼开眼

    千次阅读 2019-12-08 13:07:43
    背景图长这样子 因为中间的过渡动画没办法截出来,只能贴上变化画面,强烈建议看看 因为全部代码太长,我分开贴出来 Html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
  • 感情,无奈分开,但也不失为一段好感情;有感情,一向在一齐,但双方负能量缠身,这不能是好感情。 先来看看今天效果: 效果(1.1): (名字不用在意,本来我打算写关于购物demo,然后也没弄,就这样直接用...
  • 7.14 状态栏中文字从中间分开显示 7.15 屏蔽掉IE自带功能键 第8章 链接特效 8.1 关闭窗口链接 8.2 不用CSS实现链接样式变化 8.3 让链接没有下划线 8.4 去掉超链接点击时框 8.5 显示页面中所有链接 8.6 一个...
  • css入门笔记

    2018-05-15 14:58:57
    背景图等比放大,直到背景图完全覆盖到元素所有区域为止 4.contain 将背景图等比放大;直到背景图片碰到某个边缘位置 5.背景图片固定 作用:将普片固定在网页在某个位置,一直在可视区域内,不会随着 ...
  • 定义 数组是一种排列有序数据结构,包含于数组中变量被称为数组元素, 它们都有相同类型。 数组声明 int [] array1 = new int[5]; int [,,] array3 = new int[10,20,30]; int [] array1 = new int[] {1,2,4}...
  • flash shiti

    2014-03-14 10:32:41
    44.如何使A文字产生B向左对齐效果? A. 将光标放在每一行文字开头或结尾位置,打开Text菜单下Align级联菜单Align left命令。 B. 将光标放在每一行文字开头或结尾位置,按快捷键Ctrl+Shift+L。 C....
  • 首先,ANSI C++是在十几年前的技术条件下开发的,因此它不支持现在的概念(如Unicode字符串和生成XML文档),某些古老的语法结构是为以前的编译器设计的(如成员函数的声明和定义是分开的)。其次,Microsoft同时还试图...
  • 如何将控制流程和窗口、页面等界面元素分开//流程每一步都需要保存状态。如何能抽象出一个统一状态模型,可以使状态在留转过程中被保存和传递//最好能够用一套处理机制,能够满足WinForm程序和Web应用需要 //...
  • 千里马酒店前台管理系统V7使用手册

    热门讨论 2011-06-16 14:09:38
    中间的业务逻辑层以客单(预订单和入住登记表)为核心,连接了客房、客人、客帐这三大业务对象,归纳了酒店主要业务处理商业逻辑。如何避免排房冲突、如何确定房价等酒店业务规则,均在这一层中处理。 数据...
  • VB编程资源大全

    2007-10-17 20:47:23
    windows 95 中实现渐变的标题栏的例子(19KB) 7,clrcombo.ZIP 从combobox中选择颜色(325KB) 8,coolbar.ZIP 在vb4中显示ie风格的coolbar(30KB) 9,gradient.ZIP 实现渐变效果的背景 ...
  • php高级开发教程说明

    2008-11-27 11:39:22
    学思想、语言产生和发展的背景以及设计特点。 1.1 PHP与我 大家是否想过,为什么会有这么多的编程语言?除了所谓“主流语言”例如C、C + +、 P a s c a l等之外,还有其他的如L o g o l、C o b o l、F o r t r a n、...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    Visual C++MFC入门教程 目录 +-- 第一章 VC入门 |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序优势 ...颜色和背景色不属于字体属性。关于如何创建...
  • 21天学通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    本书是针对C++初学者编写的,不要求读者有C语言方面的背景知识,可作为高等院校教授C++课程的教材,也可供初学者自学C++时使用。 译者介绍:Jesse Liberty 编著了大量有关软件开发的图书,其中包括C++和.NET方面的...
  • 程序用方法是,从当前td开始找,如果背景是透明话,就再从父节点中找,直到找到有背景色为止。 一般来说透明属性值是"transparent",但在chrome里却是"rgba(0, 0, 0, 0)",所以用了一个属性来保存透明值: ...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    Android Android Android Android 开发背景 � 计算技术、无线接入技术发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行移动发展战略:通过与全球各地手机制造商和移动运营商...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

中间分开的背景图