- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑这个二进制图像:
正常的边缘检测算法(如 Canny )将二值图像作为输入并生成以红色显示的轮廓。我需要另一种算法,将点“P”作为第二条输入数据。 “P”是上图中的黑点。该算法应生成蓝色轮廓。蓝色轮廓表示二值图像的“P”点视线边缘。
我搜索了很多实现此目的的图像处理算法,但没有找到。我也试着想过一个新的,但还是有很多困难。
最佳答案
既然你有位图,你可以使用位图算法。
Here's a working example (在 JSFiddle 中或见下文)。 (Firefox、Chrome,但不是 IE)
伪代码:
// part 1: occlusion
mark all pixels as 'outside'
for each pixel on the edge of the image
draw a line from the source pixel to the edge pixel and
for each pixel on the line starting from the source and ending with the edge
if the pixel is gray mark it as 'inside'
otherwise stop drawing this line
// part 2: edge finding
for each pixel in the image
if pixel is not marked 'inside' skip this pixel
if pixel has a neighbor that is outside mark this pixel 'edge'
// part 3: draw the edges
highlight all the edges
起初这听起来很糟糕......但实际上,它是 O(p)
,其中 p
是图像中的像素数。
完整代码在这里,最适合整页:
var c = document.getElementById('c');
c.width = c.height = 500;
var x = c.getContext("2d");
//////////// Draw some "interesting" stuff ////////////
function DrawScene() {
x.beginPath();
x.rect(0, 0, c.width, c.height);
x.fillStyle = '#fff';
x.fill();
x.beginPath();
x.rect(c.width * 0.1, c.height * 0.1, c.width * 0.8, c.height * 0.8);
x.fillStyle = '#000';
x.fill();
x.beginPath();
x.rect(c.width * 0.25, c.height * 0.02 , c.width * 0.5, c.height * 0.05);
x.fillStyle = '#000';
x.fill();
x.beginPath();
x.rect(c.width * 0.3, c.height * 0.2, c.width * 0.03, c.height * 0.4);
x.fillStyle = '#fff';
x.fill();
x.beginPath();
var maxAng = 2.0;
function sc(t) { return t * 0.3 + 0.5; }
function sc2(t) { return t * 0.35 + 0.5; }
for (var i = 0; i < maxAng; i += 0.1)
x.lineTo(sc(Math.cos(i)) * c.width, sc(Math.sin(i)) * c.height);
for (var i = maxAng; i >= 0; i -= 0.1)
x.lineTo(sc2(Math.cos(i)) * c.width, sc2(Math.sin(i)) * c.height);
x.closePath();
x.fill();
x.beginPath();
x.moveTo(0.2 * c.width, 0.03 * c.height);
x.lineTo(c.width * 0.9, c.height * 0.8);
x.lineTo(c.width * 0.8, c.height * 0.8);
x.lineTo(c.width * 0.1, 0.03 * c.height);
x.closePath();
x.fillStyle = '#000';
x.fill();
}
//////////// Pick a point to start our operations: ////////////
var v_x = Math.round(c.width * 0.5);
var v_y = Math.round(c.height * 0.5);
function Update() {
if (navigator.appName == 'Microsoft Internet Explorer'
|| !!(navigator.userAgent.match(/Trident/)
|| navigator.userAgent.match(/rv 11/))
|| $.browser.msie == 1)
{
document.getElementById("d").innerHTML = "Does not work in IE.";
return;
}
DrawScene();
//////////// Make our image binary (white and gray) ////////////
var id = x.getImageData(0, 0, c.width, c.height);
for (var i = 0; i < id.width * id.height * 4; i += 4) {
id.data[i + 0] = id.data[i + 0] > 128 ? 255 : 64;
id.data[i + 1] = id.data[i + 1] > 128 ? 255 : 64;
id.data[i + 2] = id.data[i + 2] > 128 ? 255 : 64;
}
// Adapted from http://rosettacode.org/wiki/Bitmap/Bresenham's_line_algorithm#JavaScript
function line(x1, y1) {
var x0 = v_x;
var y0 = v_y;
var dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
var dy = Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
var err = (dx>dy ? dx : -dy)/2;
while (true) {
var d = (y0 * c.height + x0) * 4;
if (id.data[d] === 255) break;
id.data[d] = 128;
id.data[d + 1] = 128;
id.data[d + 2] = 128;
if (x0 === x1 && y0 === y1) break;
var e2 = err;
if (e2 > -dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
}
for (var i = 0; i < c.width; i++) line(i, 0);
for (var i = 0; i < c.width; i++) line(i, c.height - 1);
for (var i = 0; i < c.height; i++) line(0, i);
for (var i = 0; i < c.height; i++) line(c.width - 1, i);
// Outline-finding algorithm
function gb(x, y) {
var v = id.data[(y * id.height + x) * 4];
return v !== 128 && v !== 0;
}
for (var y = 0; y < id.height; y++) {
var py = Math.max(y - 1, 0);
var ny = Math.min(y + 1, id.height - 1);
console.log(y);
for (var z = 0; z < id.width; z++) {
var d = (y * id.height + z) * 4;
if (id.data[d] !== 128) continue;
var pz = Math.max(z - 1, 0);
var nz = Math.min(z + 1, id.width - 1);
if (gb(pz, py) || gb(z, py) || gb(nz, py) ||
gb(pz, y) || gb(z, y) || gb(nz, y) ||
gb(pz, ny) || gb(z, ny) || gb(nz, ny)) {
id.data[d + 0] = 0;
id.data[d + 1] = 0;
id.data[d + 2] = 255;
}
}
}
x.putImageData(id, 0, 0);
// Draw the starting point
x.beginPath();
x.arc(v_x, v_y, c.width * 0.01, 0, 2 * Math.PI, false);
x.fillStyle = '#800';
x.fill();
}
Update();
c.addEventListener('click', function(evt) {
var x = evt.pageX - c.offsetLeft,
y = evt.pageY - c.offsetTop;
v_x = x;
v_y = y;
Update();
}, false);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<center><div id="d">Click on image to change point</div>
<canvas id="c"></canvas></center>
关于algorithm - 二值图像 "Lines-of-Sight"边缘检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828094/
我有以下代码: 我要串联 properties.linkType至 properties.targetURL . 任何想法如何做到?我在网上找到了一些例子,但它们似乎不适用于我的用例。 最佳答案 这
我想知道是否有办法创建自定义属性,例如: 就像自定义 JSP 标签一样。 编辑: 根据 this blog 截至 2014 年 5 月 4 日,这是不可能的。有这方面的消息吗? 最佳答案 不,
我想用 data-sly-resource包含资源,但前提是它存在,例如 如果资源不存在,脚本执行失败并显示以下错误消息:找不到 servlet 来处理资源/content/blog/stats 。
我正在尝试从 Sightly 列表中的项目总数中减去 2。 ${itemList.size -2 @ context='number'} 结果是: org.
如何在 Sightly 中监听事件?我有一个包装器组件,用于保存有关其子级的信息,我希望能够让子级根据这些更改使用react。想想列组件。 我刚刚开始研究 colctrl.js /libs/wcm/f
我发现自 AEM 6.3 以来,标记本身就支持日期格式,如下所示: ${ 'dd~MMMM-yyyy' @ format=currentPage.jcr:created } (引用:https://g
我正在尝试使用 JAVA USE API 和 Sightly 迭代段落列表(com.day.cq.wcm.foundation.Paragraph)。它能够在后台获取段落。但是它无法读取该内容并将其显
所以看起来 sightly 非常适合获取属性,但我想获取我定义的其他子节点的属性。 这是我的 PictureFill 组件结构的开始: { jcr:primaryType: "nt:unstruc
我在尝试查找从多边形上的给定顶点可见的多边形上的所有顶点时遇到问题。到目前为止,我所写的内容只取得了有限的成功。 我可以生成光线到可见顶点,但前提是我的原点不在顶点上,使用以下方法: private
我有以下 Sightly 表达式: 动态链接模板如下: ${text} 这不起作用,因为 text=${'comp.masthead.navigation.home' @ i18n}
我正在尝试在 AEM 6.1 上执行以下操作: 开发一个简单的表单(3 个输入字段) 处理提交的值, 并使用处理后的值/结果重定向到同一页面 我能够将值提交给 servlet,并处理它们(业务逻辑),
在 JSTL 中,您可以在组件中设置变量,这些变量可用于同一请求中的所有其他组件。在 AEM 中使用 sightly 是否有等效的方法在组件之间传递数据? (我们正在研究的用例是我们希望一个组件知道何
我正在尝试实现递归算法解决汉诺塔 Sightly 中的问题。我知道这种方法可能没有很多明显的 实际应用,我把它当作一个谜。我最终得到了一些东西 像这样: 0}" data-sly-unwrap
我一直在关注文档 here 显然,为了让我的“use”类对我的 Sightly 组件可见,我所需要做的就是在“use”语句中使用完整的类名(即包括包)。 我已按照说明构建并部署了我的包。我编译的类就
我有 2 个 list 。对象 allList 中的 list1 和 pathList ${list1} 在我写"XXXXXXXXX"的地方,我需要放置类似的东西 ${pathL
考虑这个二进制图像: 正常的边缘检测算法(如 Canny )将二值图像作为输入并生成以红色显示的轮廓。我需要另一种算法,将点“P”作为第二条输入数据。 “P”是上图中的黑点。该算法应生成蓝色轮廓。蓝色
我正在尝试通过 Sightly 模板语言的 JavaScript UseAPI 调试存储在 JCR 中并在带有 Rhino 的服务器上运行的 JavaScript。 . 按照 sling.proper
我是 Quicksight 的新手,正在尝试更改克隆视觉对象的数据集。 我在 AWS Quicksight 中创建了一项分析,其中包含来自同一数据源的 6 个不同数据集。见下文: 分析中有两个选项卡(
在 Sightly 模板语言中,对于 Adobe AEM6 (CQ),如何仅当条件为真时才向元素添加属性,而无需复制大量代码/逻辑? 例如 Lots of other
上下文 我正在开发一个使用 Sightly 作为模板语言的 AEM 6 项目。我面临一个用例,其中我想根据 Sling 选择器的存在来显示或隐藏标记的某些部分。 例如,对 /content/my-pr
我是一名优秀的程序员,十分优秀!