P5.js - 检测图像中的角点 (JPG)
P5.js - Detect corner points within an image (JPG)
我想检测图像或“绘制”区域的角点(左上角和右下角)。为此,我想使用 javascript 库 p5.js。 findTop() 和 findBottom() 这两个函数应该可以识别角点。
起点是一只猫的素描(图1)。最后要识别图中的两个角点(见图2)
figure 1 - cat
figure 2 - Detect Corners
过程如下:用两个For循环图像数组(这里是pixels[])运行通过。对于每个像素,应该检查内容是否为黑色,如果是,则比较它是否是最小的 x 和 y 值 (x1|y1)。为了控制,相应的像素对是粉红色的。第二个 findBottom() 函数的工作方式类似。不幸的是我找不到正确的坐标,但我不知道我做错了什么...
任何帮助将不胜感激:-)
let img;
let x1, y1;
let x2, y2;
let wid = 720;
let hei = 400;
function setup() {
createCanvas(wid, hei);
img = loadImage('cat.jpg');
pixelDensity(1);
}
function draw() {
image(img, 0, 0);
loadPixels();
findTop();
findBottom();
ColorizePixel(x1,y1);
ColorizePixel(x2,y2);
updatePixels();
}
function findTop() {
x1=wid;
y1=hei;
for(let y=0; y<width; y++) {
for(let x=0; x<height; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 255 && x < x1){
x1 = x;
}
if(pixels[index] < 255 && y < y1){
y1 = y;
}
}
}
}
function findBottom() {
x2=0;
y2=0;
for(let y=0; y<width; y++) {
for(let x=0; x<height; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 255 && x > x2){
x2 = x;
}
if(pixels[index] < 255 && y > y2){
y2 = y;
}
}
}
}
function ColorizePixel(x,y){
let chosenPixel = (y * width + x) * 4;
pixels[chosenPixel]=255;
pixels[chosenPixel+1]=0;
pixels[chosenPixel+2]=255;
pixels[chosenPixel+3]=255;
}
Result of running that code
编辑#2
let img;
let x1, y1,x2, y2;
let newImage;
let wid = 720;
let hei = 400;
function setup() {
createCanvas(wid, hei);
img = loadImage('cat.jpg'); // Load the image
pixelDensity(1);
}
function draw() {
image(img, 0, 0);
loadPixels();
findTop();
findBottom();
ColorizePixel(x1,y1);
ColorizePixel(x2 ,y2);
updatePixels();
}
function findTop() {
x1=720;
y1=400;
for(let y=0; y<height; y++) {
for(let x=0; x<width; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 122 && x < x1){
x1 = x;
}
if(pixels[index] < 122 && y < y1){
y1 = y;
}
}
}
}
function findBottom() {
x2=0;
y2=0;
for(let y=0; y<height; y++) {
for(let x=0; x<width; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 122 && x > x2){
x2 = x;
}
if(pixels[index] < 122 && y > y2){
y2 = y;
}
}
}
}
//Farebe Pixel Pink ein
function ColorizePixel(x,y){
let chosenPixel = (y * width + x) * 4;
pixels[chosenPixel]=255;
pixels[chosenPixel+1]=0;
pixels[chosenPixel+2]=255;
pixels[chosenPixel+3]=255;
}
Result of running that code #2
在绘制图像和检测角之前,您需要用白色不透明颜色填充背景:
function draw() {
background(255, 255, 255);
image(img, 0, 0);
// [...]
}
我看到两个问题。
循环
你的循环 运行 y 到 width 而不是高度,x 到 height 而不是宽度。我没有早点发现。
JPEG
您正在处理 JPEG 文件。这意味着 有损 压缩。
单调的颜色不会保持单调。
不要期望白色准确地 255.
选择一个不太严格的阈值,否则您可能会“捕获”整个 jpeg 块,而不仅仅是非白色像素,因为如果压缩足够严格,一个块包含 一些 不同的像素会导致它们全部变形。
我想检测图像或“绘制”区域的角点(左上角和右下角)。为此,我想使用 javascript 库 p5.js。 findTop() 和 findBottom() 这两个函数应该可以识别角点。
起点是一只猫的素描(图1)。最后要识别图中的两个角点(见图2)
figure 1 - cat
figure 2 - Detect Corners
过程如下:用两个For循环图像数组(这里是pixels[])运行通过。对于每个像素,应该检查内容是否为黑色,如果是,则比较它是否是最小的 x 和 y 值 (x1|y1)。为了控制,相应的像素对是粉红色的。第二个 findBottom() 函数的工作方式类似。不幸的是我找不到正确的坐标,但我不知道我做错了什么...
任何帮助将不胜感激:-)
let img;
let x1, y1;
let x2, y2;
let wid = 720;
let hei = 400;
function setup() {
createCanvas(wid, hei);
img = loadImage('cat.jpg');
pixelDensity(1);
}
function draw() {
image(img, 0, 0);
loadPixels();
findTop();
findBottom();
ColorizePixel(x1,y1);
ColorizePixel(x2,y2);
updatePixels();
}
function findTop() {
x1=wid;
y1=hei;
for(let y=0; y<width; y++) {
for(let x=0; x<height; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 255 && x < x1){
x1 = x;
}
if(pixels[index] < 255 && y < y1){
y1 = y;
}
}
}
}
function findBottom() {
x2=0;
y2=0;
for(let y=0; y<width; y++) {
for(let x=0; x<height; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 255 && x > x2){
x2 = x;
}
if(pixels[index] < 255 && y > y2){
y2 = y;
}
}
}
}
function ColorizePixel(x,y){
let chosenPixel = (y * width + x) * 4;
pixels[chosenPixel]=255;
pixels[chosenPixel+1]=0;
pixels[chosenPixel+2]=255;
pixels[chosenPixel+3]=255;
}
Result of running that code
编辑#2
let img;
let x1, y1,x2, y2;
let newImage;
let wid = 720;
let hei = 400;
function setup() {
createCanvas(wid, hei);
img = loadImage('cat.jpg'); // Load the image
pixelDensity(1);
}
function draw() {
image(img, 0, 0);
loadPixels();
findTop();
findBottom();
ColorizePixel(x1,y1);
ColorizePixel(x2 ,y2);
updatePixels();
}
function findTop() {
x1=720;
y1=400;
for(let y=0; y<height; y++) {
for(let x=0; x<width; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 122 && x < x1){
x1 = x;
}
if(pixels[index] < 122 && y < y1){
y1 = y;
}
}
}
}
function findBottom() {
x2=0;
y2=0;
for(let y=0; y<height; y++) {
for(let x=0; x<width; x++) {
let index = (x + y * width) * 4;
if(pixels[index] < 122 && x > x2){
x2 = x;
}
if(pixels[index] < 122 && y > y2){
y2 = y;
}
}
}
}
//Farebe Pixel Pink ein
function ColorizePixel(x,y){
let chosenPixel = (y * width + x) * 4;
pixels[chosenPixel]=255;
pixels[chosenPixel+1]=0;
pixels[chosenPixel+2]=255;
pixels[chosenPixel+3]=255;
}
Result of running that code #2
在绘制图像和检测角之前,您需要用白色不透明颜色填充背景:
function draw() {
background(255, 255, 255);
image(img, 0, 0);
// [...]
}
我看到两个问题。
循环
你的循环 运行 y 到 width 而不是高度,x 到 height 而不是宽度。我没有早点发现。
JPEG
您正在处理 JPEG 文件。这意味着 有损 压缩。
单调的颜色不会保持单调。
不要期望白色准确地 255.
选择一个不太严格的阈值,否则您可能会“捕获”整个 jpeg 块,而不仅仅是非白色像素,因为如果压缩足够严格,一个块包含 一些 不同的像素会导致它们全部变形。