Как написать код, который может анализировать изображение, чтобы найти его без трафарета?

Я работаю над проектом в компании, которая режет дизайн с помощью лазерного резака. Недавно компания разработала веб-сайт, который позволяет клиентам загружать любое изображение по своему выбору. Чтобы вырезать рисунок, напечатанный на изображении, рисунок должен быть трафаретным. Итак, я должен написать программное обеспечение, которое может анализировать изображение, чтобы найти, где оно не является трафаретным. Если дизайн оказывается не трафаретным, система должна вывести сообщение, такое как "Дизайн не трафарет". Я полагаю, что это будет работать, понимая, где группа белых пикселей заключена в группу черных пикселей. Если белый пиксель полностью окружен черными пикселями, то дизайн не является трафаретом. Я не совсем уверен, как я могу написать программное обеспечение, которое может проверить, полностью ли белый пиксель заключен в черные пиксели. Поскольку весь предыдущий код для сайта написан на PHP, я бы предпочел использовать PHP. заранее спасибо

Это пример действительного и недействительного трафарета

1 ответ

Решение

Короче говоря, я думаю, что ваш вопрос сводится к тому, может ли ваше изображение быть "заполненным потоком" - см. Википедию.

Итак, если я просто использую 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");
?>
Другие вопросы по тегам