Есть ли алгоритм для получения штрихов строки изображения (игнорировать кривые, круги и т.д., все будет рассматриваться как линии, но все же похожие на векторы), из их пикселей? Затем получите результат из них, например, Array
?
Вот как это было бы в основном работать над чтением
Таким образом, каждая строка пикселя будет считана как 1 горизонтальная линия, и я тоже хотел бы обрабатывать вертикальные линии; но если есть сплошная жирная линия, которая занимает более 1 строки
это будет считаться одной строкой. Его ширина линии равна той же высоте пикселей, что и у нее.
Например, предположим, что у нас есть массив, содержащий строки пикселей в (красный, зеленый, синий, альфа-формат) (JavaScript):
/* formatted ImageData().data */
[
new Uint8Array([
/* first pixel */
255, 0, 0, 255,
/* second pixel */
255, 0, 0, 255
]),
new Uint8Array([
/* first pixel */
0, 0, 0, 0,
/* second pixel */
0, 0, 0, 0
])
]
Это будут данные изображения 2x2px с прямой горизонтальной красной линией. Итак, из этого массива я хочу получить массив, содержащий данные строк, например:
[
// x, y: start point
// tx, ty: end point
// w: line width
// the straight horizontal red line of 1 pixel
{ x: 0, y: 0, tx: 2, ty: 0, w: 1, rgba: [255, 0, 0, 255] }
]
Примечание. Я хотел бы обработать сглаживание.
Это моя функция для чтения пикселей в вышеуказанном формате:
var getImagePixels = function(img){
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
var imgData = ctx.getImageData(0, 0, img.width, img.height).data;
var nImgData = [];
var offWidth = img.width * 4;
var dataRow = (nImgData[0] = new Uint8Array(offWidth));
for (var b = 0, i = 0; b++ < img.height;) {
nImgData[b] = new Uint8Array(offWidth);
for (var arrI = 0, len = i + offWidth; i < len; i += 4, arrI += 4) {
nImgData[b][arrI] = imgData[i];
nImgData[b][arrI + 1] = imgData[i + 1];
nImgData[b][arrI + 2] = imgData[i + 2];
nImgData[b][arrI + 3] = imgData[i + 3];
}
}
return nImgData;
};