Я работаю над проектом в компании, которая режет проекты с помощью лазерного резака. Недавно компания разработала веб-сайт, который позволяет клиентам загружать любое изображение по своему выбору. Чтобы вырезать рисунок, напечатанный на изображении, рисунок должен быть трафаретным. Итак, я должен написать программное обеспечение, которое может анализировать изображение, чтобы найти, где оно не является трафаретным. Если дизайн оказывается не трафаретным, система должна вывести сообщение, такое как «Дизайн не трафарет». Я полагаю, что это будет работать, понимая, где группа белых пикселей заключена в группу черных пикселей. Если белый пиксель полностью заключен в черные пиксели, то дизайн не является трафаретом. Я не совсем уверен, как я могу написать программное обеспечение, которое может проверить, полностью ли белый пиксель заключен в черные пиксели. Поскольку весь предыдущий код для сайта написан на PHP, я бы предпочел использовать PHP.
заранее спасибо
Короче говоря, я думаю, что ваш вопрос сводится к тому, может ли ваше изображение быть «Наводнения заполнены» — увидеть Википедия.
Итак, если я просто использую ImageMagick в командной строке, чтобы продемонстрировать, и залейте пурпурным, чтобы вы могли видеть это:
convert valid.png -threshold 50% -fill magenta -draw 'color 0,0 floodfill' result.png
И если я сделаю то же самое с неверным изображением трафарета:
convert invalid.png -threshold 50% -fill magenta -draw 'color 0,0 floodfill' result.png
Итак, решение состоит в том, чтобы залить заливку и посмотреть, остались ли белые пиксели после этого. В реальном коде я буду заполнять черным, а не пурпурным, потому что, таким образом, мне нужно только найти, является ли самый яркий пиксель после заливки черным, или не знать ответ:
Итак, снова с ImageMagick. Залейте заливку черным и посмотрите, будет ли самый яркий пиксель после заливки черным (0) или белым (255 или 65535):
convert valid.png -threshold 50% -fill black -draw 'color 0,0 floodfill' -format "%[max]" info:
0
а теперь недействительный трафарет:
convert invalid.png -threshold 50% -fill black -draw 'color 0,0 floodfill' -format "%[max]" info:
65535
Есть небольшая морщинка — если верхний левый пиксель не белый, или черные части касаются края изображения и прекращают заливку, обтекающую края изображения. И есть простое решение для обоих: просто добавьте белую рамку шириной 1 пиксель по всему изображению, прежде чем начинать проверять, что верхний левый пиксель белый и что «покрасить» может обтекать края изображения:
convert input.png -bordercolor white -border 1 .... <as before> ...
Версия PHP
PHP не является моим родным языком программирования, поэтому могут быть и другие, более эффективные способы, но это, кажется, работает нормально
<?php
# Load the input image and get its size
$name="invalid.png";
$image=imagecreatefrompng($name);
$size=getimagesize($name);
# Threshold the image to only contain pure black and pure white
imagefilter($image,IMG_FILTER_GRAYSCALE);
imagefilter($image,IMG_FILTER_CONTRAST,-1000);
# Flood fill white areas with black
$black = imagecolorallocate($image,0,0,0);
imagefilltoborder($image,0,0,$black,$black);
$allblack=1;
# Scan the image and see if there are any non-black pixels
for($i=0;$i<$size[0];$i++){
for($j=0;$j<$size[1];$j++){
$thisColor = imagecolorat($image,$i,$j);
if($thisColor!=0){
$allblack=0;
break;
}
}
}
printf("%s: %d\n",$name,$allblack);
# Write output image
imagepng($image,"result.png");
?>
Других решений пока нет …