精华内容
下载资源
问答
  • 区域填充

    2018-10-10 21:32:00
    区域填充 区域---指已经表示成点阵形式的填充图形,是象素的集合 区域填充是指将区域内的一点(常称种子点)赋予给定颜色 ,然后将这种颜色扩展到整个区域内的过程。 区域可采用内点表示和边界表示两种表示形式 ...

    区域填充

    区域---指已经表示成点阵形式的填充图形,是象素的集合

    区域填充是指将区域内的一点(常称种子点)赋予给定颜色 ,然后将这种颜色扩展到整个区域内的过程。

     

    区域可采用内点表示和边界表示两种表示形式

     

    内点表示:枚举出区域内部的所有像素,内部的所有像素着 同一个颜色,边界像素着与内部像素不同的颜色

    边界表示:枚举出边界上的所有像素,边界上的所有像素 着同一个颜色,内部像素着与边界像素不同的颜色

    区域填充算法要求区域是连通的,因为只有在连通区域中, 才可能将种子点的颜色扩展到区域内的其它点。

    区域可分为4向连通区域和8向连通区域

    4向连通区域指的是从区域上一点出发,可通过四个方向 ,即上、下、左、右移动的组合,在不越出区域的前提 下,到达区域内的任意象素

    8向连通区域指的是从区域内每一象素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这 八个方向的移动的组合来到达

     

    简单四连通种子填充算法(区域填充递归算法)

    种子填充算法的原理是:假设在多边形区域内部有一像 素已知,由此出发找到区域内的所有像素,用一定的颜色或灰度来填充

    假设区域采用边界定义,即区域边界上所有像素均具有某 个特定值,区域内部所有像素均不取这一特定值,而边界外的像素则可具有与边界相同的值

     

    考虑区域的四向连通,即从区域上一点出发,可通过四个方 向,即上、下、左、右移动的组合,在不越出区域的前提下 ,到达区域内的任意像素。

     

    使用栈结构来实现简单的种子填充算法

    算法原理如下:

    种子像素入栈,当栈非空时重复执行如下三步操作:

    (1)栈顶像素出栈

    (2)将出栈像素置成要填充色

    (3)按左、上、右、下顺序检查与栈像素相邻的四个像素,若其中某个像素不在边界且未置 成填充色,则把该像素入栈

     

     

    种子填充算法的不足之处

    (1)有些像素会入栈多次,降低算法效率;栈结构占空间

    (2)递归执行,算法简单,但效率不高。区域内每一像素 都引进一次递归,进/出栈,费时费内存

    (3)改进算法,减少递归次数,提高效率

     

    可以采用区域填充的扫描线算法

     

    多边形的扫描转换与区域填充算法小结

    基本思想不同

     多边形扫描转换是指将多边形的顶点表示转化为点阵表示

     区域填充只改变区域的填充颜色,不改变区域表示方法

     

     基本条件不同

     在区域填充算法中,要求给定区域内一点作为种子点,然后从这一 点根据连通性将新的颜色扩散到整个区域

     扫描转换多边形是从多边形的边界(顶点)信息出发,利用多种形式 的连贯性进行填充的

     

    扫描转换区域填充的核心是知道多边形的边界,要得到多 边形内部的像素集,有多种方法。其中扫描线算法是利用 一套特殊的数据结构,避免求交,然后一条条扫描线确定

    区域填充条件更强一些,不但知道边界,而且还知道区域 内的一点,可以利用四连通或八连通区域不断往外扩展

    转载于:https://www.cnblogs.com/cnblog-wuran/p/9769238.html

    展开全文
  • 区域填充文件

    2013-12-28 20:50:16
    所谓区域填充,指的是在输出平面的闭合区域内完整地填充某种颜色或图案。以下所述及的区域填充算法
  • 区域填充算法

    2010-06-03 15:50:12
    区域填充算法 区域填充算法 区域填充算法
  • 区域填充概述

    2020-03-23 23:03:28
    区域填充 区域填充是指将区域内的一点(常称种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。 1.区域及其表示 区域---指已经表示成点阵形式的填充图形,是象素的集合。 区域可以采用内点表示和边界...

                                            区域填充

                   区域填充是指将区域内的一点(常称种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。

    1.区域及其表示

           区域---指已经表示成点阵形式的填充图形,是象素的集合。
           区域可以采用内点表示和边界表示:

                     

    内点表示 枚举出区域内部的所有像素,内部的所有像素着同一个颜色,边界像素着与内部像素不同的颜色
    边界表示 枚举出边界上的所有像素,边界上的所有像素着同一个颜色,内部像素着与边界像素不同的颜色

    2.区域的连通(注意是区域内还是区域上)

      区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。
      

    连通区域的分类
    4向连通区域 从区域上一点出发,可通过四个方向,即上、下、左、右移动的组合,在不越出区域的前提下,到达区域的任意象素
    8向连通区域 从区域内每一象素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这八个方向的移动的组合来到达区域的任意象素
     

                                          

    3.区域填充递归算法

    1)算法原理:假设在多边形区域内部有一像素已知,由此出发找到区域内的所有像素,用一定的颜色或灰度来填充。

    2)算法依据(边界与区域内部的像素值不同):

             即假设区域采用边界定义,即区域边界上所有像素均具有某个特定值,区域内部所有像素均不取这一特定值,而边界外的像素则可具有与边界相同的值。
    3)算法实现

    使用栈结构来实现简单的种子填充算法,算法原理如下:
       种子像素入栈(任选一个未填充颜色的),当栈非空时重复执行如下三步操作:
    (1)栈顶像素出栈
    (2)将出栈像素置成要填充色
    (3)按左、上、右、下顺序检查与栈像素相邻的四个像素,若其中像素不在边界且未置成填充色的,一个一个的把他们入栈


    4)算法的不足与改进

    a.有些像素会入栈多次,降低算法效率;栈结构占空间

    b.递归执行,算法简单,但效率不高。区域内每一像素都引进一次递归,进/出栈,费时费内存
    c.改进算法,减少递归次数,提高效率

    5)多边形的扫描转换与区域填充算法

    ①基本思想不同:

                 多边形扫描转换是指将多边形的顶点表示转化为点阵表示,而区域填充只改变区域的填充颜色,不改变区域表示方法。②基本条件不同
                 在区域填充算法中,要求给定区域内一点作为种子点,然后从这一点根据连通性将新的颜色扩散到整个区域。故其不但知道边界,而且还知道区域内的一点,进而可以利用四连通或八连通区域不断往外扩展
                 扫描转换多边形是从多边形的边界(顶点)信息出发,利用多种形式的连贯性进行填充的。

                     

     

    展开全文
  • 计算机图形学区域填充的C++实现
  • 多边形区域填充算法

    2014-10-28 09:22:06
    多边形区域填充算法,
  • 西安工程大学实验报告 课程 实验名称区第 1 页 共 6 页 系 别 组别_ 实 验 报 告 日 期 年 月 日 姓 名 学号 报 告 退 发 ( 订正 重做 ) E_mail_ 教 师 审 批 评 分_ 区域填充算法 一实验目的和任务 1?学习多边形...
  • 实现这个功能简单分为两个步骤:1、首先在图像中设置ROI(region of interest,目标区域),2、在该区域填充目标图像。 有了思路,我们的主要工作就是考虑如何把它们转化成机器语言。 让我们看看下面的一段代码代码:#...

    在图像处理中,经常需要在图像的指定区域替换成另一幅图像,如何通过opencv实现这种效果呢?下面就让我们进行具体介绍。

      实现这个功能简单分为两个步骤:1、首先在图像中设置ROI(region of interest,目标区域),2、在该区域填充目标图像。

      有了思路,我们的主要工作就是考虑如何把它们转化成机器语言。

      让我们看看下面的一段代码代码:

    #include #includeusing namespace std;using namespace cv;void main(){//读取待填充图像,  Mat image = imread("lena.jpg");  imshow("原始图", image);  //读取待复制图片  Mat roi =imread("cat_face.jpg");  imshow("roi", roi);  Mat dst;  //缩放图像  resize(roi, dst, Size(120, 150), 0, 0, CV_INTER_LINEAR);  //设置绘制区域并复制  Rect roi_rect = Rect(230, 100, dst.cols, dst.rows);  dst.copyTo(image(roi_rect));  imshow("result", image);  waitKey();}
     Rect roi_rect = Rect(230, 100, dst.cols, dst.rows);

    该行程序作用是设置在待填充图像的填充区域以及填充大小,(230,100)表示填充起始坐标,dst.cols, dst.rows表示填充区域的高和宽。

    dst.copyTo(image(roi_rect))是把填充图像复制到待填充区域中。这样我们就完成了在图像指定区域填充目标图像。

    实现结果如下:

    b55dfb7d1ddeb339d44e3a6ffa04d9de.png

    每天学习一点点,每天进步一点点,坚持才会更优秀!!!!

    “动动手指扫码或微信搜一搜关注哟

    d37c9f1274a146b0c9f2f8125de0e036.png

    展开全文
  • 亲测可用的区域填充,可支持图像填充,图形等填充。。
  • d3 曲线区域填充

    2019-06-13 00:14:00
    本篇以一个简单的demo示范一下在d3中实现曲线的区域填充。 clip-path clip-path:创建一个只有元素的部分区域可以显示的剪切区域。显示clip-path内部的区域,而外部的区域不可见。 区域填充也主要以clip-path为基础...

    本篇以一个简单的demo示范一下在d3中实现曲线的区域填充。

    clip-path

    clip-path:创建一个只有元素的部分区域可以显示的剪切区域。显示clip-path内部的区域,而外部的区域不可见。

    区域填充也主要以clip-path为基础来实现。

    区域填充

    1.1 先画一条曲线

    
    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
        </head>
    
        <body>
            <div id="test-svg">
            </div>
        </body>
        <script src="https://d3js.org/d3.v5.js"></script>
        <script type="text/javascript" src="js/2D.js"></script>
        <script>
            window.onload = function() {
                
                // 数据
                var data = [{
                    date: new Date(2019, 3, 24),
                    value: 23.24
                }, {
                    date: new Date(2019, 3, 25),
                    value: 72.15
                }, {
                    date: new Date(2019, 3, 26),
                    value: 38.84
                }, {
                    date: new Date(2019, 3, 27),
                    value: 58.62
                }, {
                    date: new Date(2019, 3, 30),
                    value: 10.80
                }, {
                    date: new Date(2019, 4, 1),
                    value: 85.47
                }];
                
                var width = 800,
                    height = 400,
                    padding = {
                        top: 40,
                        right: 40,
                        bottom: 40,
                        left: 40
                    };
                    
                var colors = d3.schemeSet2;
                var svg = d3.select("#test-svg")
                    .append('svg')
                    .attr('width', width + 'px')
                    .attr('height', height + 'px');
                    
                // x轴:时间轴
                var xScale = d3.scaleTime()
                    .domain(d3.extent(data, function(d) {
                        return d.date;
                    }))
                    .range([padding.left, width - padding.right]);
                    
                var xAxis = d3.axisBottom()
                    .scale(xScale)
                    .tickSize(10);
                    
                svg.append('g')
                    .call(xAxis)
                    .attr("transform", "translate(0," + (height - padding.bottom) + ")")
                    .selectAll("text")
                    .attr("font-size", "10px")
                    .attr("dx", "50px");
    
                var ymax = d3.max(data, function(d) {
                    return d.value;
                });
    
                // y轴
                var yScale = d3.scaleLinear()
                    .domain([0, ymax])
                    .range([height - padding.bottom, padding.top]);
                    
                var yAxis = d3.axisLeft()
                    .scale(yScale)
                    .ticks(10);
                    
                svg.append('g')
                    .call(yAxis)
                    .attr("transform", "translate(" + padding.left + ",0)");
                    
                var curveLine = d3.line()
                    .x(function(d) {
                        return xScale(d.date);
                    })
                    .y(function(d) {
                        return yScale(d.value);
                    })
                    .curve(d3.curveCatmullRom.alpha(0.5));
                    
                svg.append("path")
                    .datum(data)
                    .attr("fill", "none")
                    .attr("stroke", "steelblue")
                    .attr("stroke-width", 1.5)
                    .attr("stroke-linejoin", "round")
                    .attr("stroke-linecap", "round")
                    .attr("d", curveLine);
    
                    
            }
        </script>
    
    </html>
    

    1487780-20190612235026747-1355400728.png

    2.2 添加一条水平的阈值线

    
    // 水平阈值
                svg.append('line')
                    .attr('x1', 0)
                    .attr('y1', yScale(45))
                    .attr('x2', width)
                    .attr('y2', yScale(45))
                    .attr('stroke', '#FFA354')
                    .attr('stroke-width', 1.5)
                    .attr('stroke-dasharray', '6,4');
    

    1487780-20190612235230508-1554525238.png

    3.3 填充阈值线上面部分

    
    
    // 添加一个clipPath 
    svg.append("clipPath")
                    .attr("id", "clip-th")
                    .append("rect")
                    .attr("x", 0)
                    .attr("y", padding.top)
                    .attr("width", width)
                    .attr("height", yScale(45) - yScale(ymax));
    
    // 再次添加一条曲线并填充区域            
                svg.append("path")
                    .datum(data)
                    .attr("fill", "steelblue")
                    .attr("fill-opacity", 0.5)
                    .attr("stroke", "none")
                    .attr("d", curveLine)
                    .attr('clip-path', "url(#clip-th)");
    
    

    1487780-20190612235651152-684619750.png

    1487780-20190612235707448-1389804085.png

    • path填充的时候会把首尾点连起来,并不是我们想要的效果。所以我们再首尾都添加一个点,来控制填充区域。

    4.4 修改数据,重新绘制填充区域

    
    data.unshift({
                    date: new Date(2019, 3, 24),
                    value: 0
                });
                data.push({
                    date: new Date(2019, 4, 1),
                    value: 0
                });
                
                svg.append("path")
                    .datum(data)
                    .attr("fill", "steelblue")
                    .attr("fill-opacity", 0.5)
                    .attr("stroke", "none")
                    .attr("d", curveLine)
                    .attr('clip-path', "url(#clip-th)");
    

    1487780-20190613000215480-1713936130.png

    • 目的是达到了但是效果并不是很理想。由于额外的添加了两个点生成的曲线和原曲线产生了偏差。个人觉得比较理想的做法是
      再添加一条红线所示的正常直线path。然后将两个直线和曲线组合起来进行填充。

    1487780-20190613000720871-1334358938.png

    5.5 再次修改数据,重新绘制

    
    // 红线所示直线数据
    var data2 = [{
                    date: new Date(2019, 3, 24),
                    value: 23.24
                }, {
                    date: new Date(2019, 3, 24),
                    value: 0
                }, {
                    date: new Date(2019, 4, 1),
                    value: 0
                }, {
                    date: new Date(2019, 4, 1),
                    value: 85.47
                }];
    
    // 添加直线生成器
    var line = d3.line()
                    .x(function(d) {
                        return xScale(d.date);
                    })
                    .y(function(d) {
                        return yScale(d.value);
                    });
    
    
    // 绘制两个path
    container.append("path")
                    .datum(data)
                    .attr("fill", "none")
                    .attr("d", curveLine);
                    
                container.append("path")
                    .datum(data2)
                    .attr("fill", "none")
                    .attr("d", line);
    
    // 将两个path合并
    var combined = "";
                container.selectAll("path")
                    .each(function() {
                        combined += d3.select(this).attr("d");
                    });
                    
                container.selectAll("path").remove();
                
                            // 绘制合并后的path
                container.append("path")
                    .attr("stroke", "none")
                    .attr("d", combined)
                    .attr("fill", "steelblue")
                    .attr("fill-opacity", 0.5)
                    .attr("fill-rule", "evenodd")
                    .attr('clip-path', "url(#clip-th)");
    

    1487780-20190613001120413-258823735.png

    • 我们就能看到完全的区域填充了。切记要使用fill-rule来约定填充的区域。

    6.6 添加两条垂直的阈值

    
    // 垂直阈值线
                svg.append('line')
                    .attr('x1', xScale(new Date(2019, 3, 26)))
                    .attr('y1', yScale(ymax))
                    .attr('x2', xScale(new Date(2019, 3, 26)))
                    .attr('y2', yScale(0))
                    .attr('stroke', '#FFA354')
                    .attr('stroke-width', 1.5)
                    .attr('stroke-dasharray', '6,4')
    
                svg.append('line')
                    .attr('x1', xScale(new Date(2019, 3, 28)))
                    .attr('y1', yScale(ymax))
                    .attr('x2', xScale(new Date(2019, 3, 28)))
                    .attr('y2', yScale(0))
                    .attr('stroke', '#FFA354')
                    .attr('stroke-width', 1.5)
                    .attr('stroke-dasharray', '6,4')
    
    // clip-path
    
    svg.append("clipPath")
                    .attr("id", "clip-th2")
                    .append("rect")
                    .attr("x", xScale(new Date(2019, 3, 26)))
                    .attr("y", yScale(45))
                    .attr("width", xScale(new Date(2019, 3, 28)) - xScale(new Date(2019, 3, 26)))
                    .attr("height", yScale(0) - yScale(45));
    
    container.append("path")
                    .attr("stroke", "none")
                    .attr("d", combined)
                    .attr("fill", "yellowgreen")
                    .attr("fill-opacity", 0.5)
                    .attr("fill-rule", "evenodd")
                    .attr('clip-path', "url(#clip-th2)");
    

    1487780-20190613001342414-1856794644.png

    • 这下就大功告成了!

    转载于:https://www.cnblogs.com/chenjy1225/p/11013643.html

    展开全文
  • 计算机图形 区域填充

    2013-06-16 19:23:25
    大学计算机图形学实验 图形的区域填充源代码
  • 本文主要介绍几种区域填充算法,重点解释多边形的扫描线填充算法,最后实现了多边形填充算法,包括在附录文件中。在参考【5】中,作者详细介绍了一系列区域填充算法,可以查看相应网页。代码的下载地址为:...
  • 一、区域填充概念区域:指已经表示成点阵形式的填充图形,是象素的集合。区域填充:将区域内的一点(常称【种子点】)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。区域填充算法要求区域是连通的,因为只有在...
  • 区域填充算法研究

    2012-03-19 17:31:25
    该算法涵盖了区域填充算法的各个方面,包括种子填充算法,多边形填充算法等等、
  • 多边形的区域填充

    2013-07-09 12:15:20
    有多边形的绘制,还有鼠标命令,有关于多边形的区域填充
  • 本文实例为大家分享了OpenGL实现不规则区域填充算法,供大家参考,具体内容如下 一、简单递归 利用Dfs实现简单递归填充。 核心代码: // 简单深度搜索填充 (四连通) void DfsFill(int x, int y) { if (x < 0>23 ...
  • 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充)。区域填充...
  • MFC_区域填充

    2012-12-05 15:57:35
    MFC关于图形的区域填充,若图形较大,请修改堆栈
  • 用VS2013,OPENGL环境实现多边形的扫描转换和区域填充,附上OPENGL配置文件。多边形的扫描转换:有效边表算法,多边形的区域填充:边界填充算法。
  • 计算机图形学中的区域填充的扫描线算法的程序实现.
  • 图形学-区域填充

    2020-07-24 09:21:49
    图形学-区域填充定义边界填充算法泛填充算法 定义 区域填充指的是从区域内的一点(种子点)开始由内向外将填充色扩展到整个区域的过程,这里的区域都是指已经表示成点阵形式的填充图形,它是一个像素集合,区域通常...
  • 计算机图形学的区域填充算法
  • 江苏科技大学计科专业计算机图形学实验图形区域填充代码,列表应该还有实验报告

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,296
精华内容 3,318
关键字:

区域填充