- 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/
当前问题陈述的输入是 - 输入.txt #START_OF_TEST_CASES #DATA key1:VA1 key2:VA2 key3:VA3 key4:VA4 key5:VA5 #DEND #E
编辑:添加了 PDO 调用。 这是实际的错误: Notice: Object of class PDOStatement could not be converted to int in Unknow
“git diff --stat”和“git log --stat”显示如下输出: $ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56
我有一个具有以下格式的输入文件:安大略省:布兰普顿:北纬 43° 41':西经 79° 45'安大略省:多伦多:北纬 43° 39':西经 79° 23'魁北克省:蒙特利尔:北纬 45° 30':西经
空白行仅包含\n或\r\n或\r。 tempfile = open(file,"r") for id,line in enumerate(tempfile): if(line != "\n"
我尝试使用 BABYLON.js 开发棋盘游戏我有一个板子和一个 ArcRotateCamera。 我的灯是 HemisphericLight 当我在板上画线时,我希望这些线具有相同的外观。现在,当我
我尝试使用 BABYLON.js 开发棋盘游戏我有一个板子和一个 ArcRotateCamera。 我的灯是 HemisphericLight 当我在板上画线时,我希望这些线具有相同的外观。现在,当我
有一个while read循环: while read line; do grep "^$line" file1 done < target 我应该使用 "^$line" 来获得正确答案。我想
我有一个我无法解决的 numpy 问题。我有填充 0 和 1 的 3D 数组 (x,y,z)。例如,z 轴上的一个切片: array([[1, 0, 1, 0, 1, 1, 0, 0],
作为临时方法,我使用 .txt 文件来存储程序的某些变量。写入与 fs.appendFile 完美配合,但考虑到它的大小,使用 fs.readFile 读取不合适 - 我想得到某一行 来自文件,以及
我试图找到一种通过R studio进行调试的方法,但是我发现的所有解决方案都无法真正起作用。 1.)CTRL + enter:有效,但不会通过循环的每次迭代,而只能执行一次。 2.)添加“browse
在我的应用程序中,我的 EditText 左侧有行号 - 到目前为止一切都很好,行号与 EditText 的行完全对齐。 问题是,如果用户更改 EditText 的文本大小,则行号无法正确对齐。所以我
通过使用 + 的参数调用它,我可以使 vim 将光标定位在文件的最后一行。 : vi + myfile # "+" = go to last line of file 我怎样才能做到
我已经在文件中写入了这样的数据(某种) {:a 25 :b 28} {:a 2 :b 50} ... 我想要这些 map 的惰性序列。 大约有 4000 万行。我也可以写 10000 的 block
我在文本区域中发现了一个奇怪的错误(?)... 比如说,有一个 使用多行文本(用户粘贴的文本或预设文本无关紧要,两者都经过测试)。 我想从 中获取文本并替换 \n与其他东西......结果是,.re
我需要一个新行,这样我就可以在 PFD 中看到一个格式,我尝试添加一个页面宽度但它没有用,我用另一个东西/n 也没有用。这是我的代码。我可以手动添加格式,因为我需要显示从数据库中获取的信息,并且我在一
我正在尝试编写一个 Java 程序,它将大量 GPS 坐标捕捉到线形文件(道路网络),并且不仅返回新坐标,还返回捕捉到的线段的唯一标识符。该标识符是否是 FID、其他语言中使用的“索引”(即,其中 1
你好,我正在努力处理 JavaScript/NodeJS 中的数组。 基本上,这是我的代码: let arr = new Array(); arr = { "Username" : var1,
我正在学习 matplotlib 的基本教程,我正在处理的示例代码是: import numpy as np import matplotlib.pylab as plt x=[1,2,3,4] y=
所以,假设我有一个包含 20 行的文本文件,每行都有不同的文本。我希望能够有一个包含第一行的字符串,但是当我执行 NextLine(); 时我希望它成为下一行。我试过了,但它似乎不起作用: strin
我是一名优秀的程序员,十分优秀!