我在现场采集图片,需要初步筛选出NG和OK的图片,我发现得到NG的原图后,肉眼看不到哪里NG了,或者说很难找。这个时候,我想保存NG的同时再保存一张标记了NG位置的图片。
paint_region (SelectedRegions1, Image, ImageResult, [0,255,0], 'fill')
其中 SelectedRegions1 是筛选出的NG的区域,image 是原图。
[0,255,0] 表示RGB,[0,255,0] 就是用绿色标记该区域。
paint_region 就会在Image的基础上再绘制一个SelectedRegions1 区域。
输出就是ImageResult。‘fill’ 表示是填充区域的方式。反之可以选择margin。
有了ImageResult,我们就可以利用:
write_image (ImageResult, ‘tiff’, 0, ‘sss’)
讲图片保存到本地了。tiff,是图片的格式。0,表示图片区域之外用什么颜色进行填充。第三个就是保存图片的名称。
到了现场采集之后,我发现上面测试通过的代码,却没有看到标记显示在原图中。
最后发现,原因是测试的时候,我用的是24位的3通道的图片。而现场采集到的是8位的单通道的图片。
那么问题来了,如何保存彩色到单通道图片呢?直接上代码:
paint_region (SelectedRegions1, Image, imgR, 0, 'fill')
paint_region (SelectedRegions1, Image, imgG, 255, 'fill')
paint_region (SelectedRegions1, Image, imgB, 0, 'fill')
compose3 (imgR, imgG, imgB, MultiChannelImage)
write_image (MultiChannelImage, 'tiff', 0, 'sss')
那么,就是先根据单通道的原图,构建三个图,分别给标记的地方上色。
然后再讲三个图,通过compose3 按rgb的顺序合并成一个3通道的图!
下面,给出对应的C#代码
if (img.CountChannels() == 1)
{
HOperatorSet.PaintRegion(markRegion, img, out imgR, new HTuple(255), "fill");
HOperatorSet.PaintRegion(markRegion, img, out imgG, new HTuple(0), "fill");
HOperatorSet.PaintRegion(markRegion, img, out imgB, new HTuple(0), "fill");
HOperatorSet.Compose3(imgR, imgG, imgB, out ho_ImageResult);
HOperatorSet.WriteImage(ho_ImageResult, "tiff", 0, fullMarkPath);
}
else
{
HOperatorSet.PaintRegion(markRegion, img, out ho_ImageResult, ((new HTuple(255)).TupleConcat(0)).TupleConcat(0), "fill");
HOperatorSet.WriteImage(ho_ImageResult, "tiff", 0, fullMarkPath);
}
代码中,通过 img.CountChannels() 判断图片的通道数,然后根据通道数不通,做不同的处理!
在这个例子中我们用到了以下算子
1 paint_region 在图片中添加区域
2 write_image 保存图片到本地
3 compose3 合并单通道图片生成三通道图片
4 count_channels 获取图片的通道数