我正在一家公司从事一个使用激光切割机切割设计的项目。该公司最近开发了一个网站,允许客户上传他们选择的任何图像。为了切割印在图像上的设计,设计必须是模板。所以,我必须编写一个软件来分析图像以找到它没有被模板化的地方。如果设计结果是非模板化的,则系统应输出一条消息,例如“设计不是模板”。我想这可以通过了解一组白色像素被一组黑色像素包围的位置来工作。如果一个白色像素完全被黑色像素包围,那么这个设计就不是模板。我不太确定如何编写一个可以检查白色像素是否完全被黑色像素包围的软件。由于网站之前的所有代码都是用 PHP 编写的,我更喜欢使用 PHP。提前致谢
问问题
139 次
1 回答
3
简而言之,我认为您的问题归结为您的图像是否可以“充满洪水” - 请参阅Wikipedia。
所以,如果我只是在命令行中使用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");
?>
于 2016-10-29T09:19:43.400 回答