{
const inputImage = await FileAttachment("image.png").image()
const gray = Object.assign(DOM.canvas(inputImage.width, inputImage.height),{id:'grayCanvas'});
const filtered = Object.assign(DOM.canvas(inputImage.width, inputImage.height),{id:'filteredCanvas'});
const canny = Object.assign(DOM.canvas(inputImage.width, inputImage.height),{id:'cannyCanvas'});
const out = Object.assign(DOM.canvas(inputImage.width, inputImage.height),{id:'outCanvas'});
let src = cv.imread(inputImage );
let dst = cv.Mat.zeros(src.rows, src.cols, cv.CV_8UC3);
let dst2 = cv.Mat.zeros(src.rows, src.cols, cv.CV_8UC3);
let lines = new cv.Mat();
let colour = new cv.Scalar(200, 150, 150);
cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY, cv.CV_8UC1);
cv.imshow(gray, src);
cv.bilateralFilter(src, dst2, bf1, bf2, bf3, cv.BORDER_DEFAULT);
cv.imshow(filtered, dst2);
cv.Canny(dst2, src, T1, T2,3);
cv.imshow(canny, src);
cv.HoughLinesP(src, lines, hl1, Math.PI / hl2, hl3, hl4, hl5);
for (let i = 0; i < lines.rows; ++i) {
let startPoint = new cv.Point(lines.data32S[i * 4], lines.data32S[i * 4 + 1]);
let endPoint = new cv.Point(lines.data32S[i * 4 + 2], lines.data32S[i * 4 + 3]);
cv.line(dst, startPoint, endPoint, colour);
}
cv.imshow(out, dst);
src.delete();
dst.delete();
dst2.delete();
lines.delete();
const css = 'max-width:100%';
inputImage.style.cssText += css;
out.style.cssText += css;
gray.style.cssText += css;
filtered.style.cssText += css;
canny.style.cssText += css;
return html`
<div style="display:flex;max-width:${width}px">
<div style="padding-right:10px">${inputImage}</div>
<div style="padding-right:10px">${gray}</div>
<div style="padding-right:10px">${filtered}</div>
<div style="padding-right:10px">${canny}</div>
<div style="padding-right:10px">${out}</div>
`
}