1. 简单图像拼接
简单图像的拼接,不涉及图像融合,仅简单地平移将多张图拼接成一张图。
明确问题:
将多少张图拼起来?由于是多张图,这需要一个元组来存储多张图片的集合。
是横向拼图,还是纵向拼图?这涉及拼图的方向。
是一张挨着一张无缝拼接吗?能不能做“有缝”的自由拼接?这涉及拼接偏移量。
tile_images
算子签名:tile_images(Images : TiledImage : NumColumns, TileOrder : )
输入参数:
Images(输入对象):多个待拼接的图像(单个图像组成的元组)。
输出参数:
TiledImage(输出对象):拼接后的大图像
控制参数:
NumColumns:指定在水平方向上排列的图像数量(即每行几个图像)
TileOrder:图片排列的顺序 "horizontal"(水平顺序)或 "vertical"(垂直顺序)
注意:
输入图像的通道数必须相同,因此需要在前面增加通道数的判断。
输入图像的尺寸必须相同,因此需要在前面增加图像尺寸的判断。
// 检测图像通道数,结果图为三通道彩色,原图为单通道
HTuple channels1, channels2;
HalconCpp::CountChannels(hoImage1Scaled, &channels1);
HalconCpp::CountChannels(hoImage2Scaled, &channels2);
if (channels1.I() == 1 && channels2.I() == 3) {
HalconCpp::Compose3(hoImage1Scaled, hoImage1Scaled, hoImage1Scaled, &hoImage1Scaled);
}
else if (channels1.I() == 3 && channels2.I() == 1) {
HalconCpp::Compose3(hoImage2Scaled, hoImage2Scaled, hoImage2Scaled, &hoImage2Scaled);
}
TileOrder参数决定了图像是按行优先(水平)还是列优先(垂直)排列
如果我们设置 TileOrder = "horizontal",那么图像会按行排列,即先从左到右排列,排满一行再排下一行(行优先)。
如果我们设置 TileOrder = "vertical",那么图像会按列排列,即先从上到下排列,排满一列再排下一列(列优先)。
例子:
read_image (Image1, '01.jpg')
read_image (Image2, '02.jpg')
get_image_size (Image2, Width, Height)
gen_empty_obj (imgs)
concat_obj (imgs, Image1, imgs)
concat_obj (imgs, Image2, imgs)
tile_images (imgs, TiledImage, 3 , 'vertical') // 按列优先排列
tile_images_offset
算子签名:tile_images_offset(Images : TiledImage : OffsetRow, OffsetCol, Row1, Col1, Row2, Col2, Width, Height : )
输入参数:
Images(输入对象):多个待拼接的图像(单个图像组成的元组)。
输出参数:
TiledImage(输出对象):拼接后的大图像。
控制参数:
OffsetRow, OffsetCol:(输入控制):每个图像在大图中的偏移量(行、列方向)。这两个参数是多个偏移量组成的元组,其长度必须与输入图像数量一致。
Row1, Col1, Row2, Col2(输出控制):可选项,返回大图中每个图像的区域坐标(左上角Row1, Col1;右下角Row2, Col2)。
Width, Height(输出控制):可选项,返回拼接后大图像的宽度和高度。
例子:
// 假设有两张图像: image1 和 image2
HObject image1,image2;
HObject hoTiledImage;
// 制作图像元组
GenEmptyObj(&hoTiledImage);
ConcatObj(hoTiledImage, image1, &hoTiledImage);
ConcatObj(hoTiledImage, image2, &hoTiledImage);
// 设置偏移量:
// image1 放置在 (0, 0)
// image2 放置在 image1 右侧,距离50像素,以每张图像的左上角点作为起始点
HTuple hv_OffsetRow = {0, 0}; // 行偏移
HTuple hv_OffsetCol = {0, 50}; // 列偏移
// 不指定输出尺寸,由算子自动计算
HTuple hv_Width, hv_Height;
hv_Width = HTuple();
hv_Height = HTuple();
// 执行拼接
HTuple hv_Row1, hv_Col1, hv_Row2, hv_Col2;
HalconCpp::TileImagesOffset(hv_Images, &hoTiledImage,
hv_OffsetRow, hv_OffsetCol,
&hv_Row1, &hv_Col1, &hv_Row2, &hv_Col2,
&hv_Width, &hv_Height
);