纯halcon实现拉普拉斯图像融合

目录

  • 前言
  • 代码
  • 结果

前言

这是纯利用halcon实现的拉普拉斯图像融合,按我理解的算法步骤如下:
1、分别生成两图像的高斯金字塔;
2、取高斯金字塔的第level层(level:人为设定的想要融合的层数),作为拉普拉斯金字塔的最顶层;
3、依次对level、level-1、… 高斯金字塔作差分生成拉普拉斯金字塔;
4、将两图的拉普拉斯金字塔左右拼接在一起;
5、将拼接的拉普拉斯金字塔重构成融合图;
看别人写的文章融合的图就很惊艳,自己得到的结果就感觉怪怪的,可能和我直接用的“get_image_size”算子上采样有关,如果有大神发现问题所在,还请不吝赐教。

代码

dev_close_window ()
dev_open_window (0, 0, 400, 400, 'black', WindowHandle)
dev_set_color ('red')
dev_set_draw ('margin')
dev_update_off ()

* 高斯金字塔采样缩放因子
scaleSize := 0.5

* 构建的拉普拉斯金字塔层数
level := 5

read_image (Apple, 'apple.jpg')
read_image (Orange, 'orange.jpg')

convert_image_type (Orange, Orange, 'real')
convert_image_type (Apple, Apple, 'real')

* 确保两张图片尺寸相等
get_image_size (Apple, Width, Height)
get_image_size (Orange, Width1, Height1)
factor_w := min2(real(Width/Width1), real(Width1/Width))
factor_h := min2(real(Height/Height1), real(Height1/Height))
zoom_image_factor (Apple, Apple, factor_w, factor_h, 'weighted')
zoom_image_factor (Orange, Orange, factor_w, factor_h, 'weighted')

* 生成高斯金字塔
gen_gauss_pyramid (Orange, OrangePyramid, 'weighted', scaleSize)
gen_gauss_pyramid (Apple, ApplePyramid, 'weighted', scaleSize)

count_obj (ApplePyramid, Number2)
if(Number2 < level)
    level := Number2
endif

* 生成拉普拉斯金字塔
* 橘子
count_obj (OrangePyramid, Number)
gen_empty_obj (LaplasPyramid)
select_obj (OrangePyramid, ObjectSelected, level)
concat_obj (LaplasPyramid, ObjectSelected, LaplasPyramid)
for i := level to 2 by -1
    select_obj (OrangePyramid, ObjectSelected, i)
    *zoom_image_factor (ObjectSelected, ImageZoomed, 1.0/scaleSize, 1.0/scaleSize, 'weighted')
    select_obj (OrangePyramid, ObjectSelected1, i-1)
    get_image_size (ObjectSelected1, Width3, Height3)
    zoom_image_size (ObjectSelected, ImageZoomed, Width3, Height3, 'weighted')
    sub_image (ObjectSelected1, ImageZoomed, ImageSub, 1, 0)
    concat_obj (LaplasPyramid, ImageSub, LaplasPyramid)
endfor
copy_obj (LaplasPyramid, OrangeLaplasPyramid, 1, -1)

* 苹果
count_obj (ApplePyramid, Number)
gen_empty_obj (LaplasPyramid)
select_obj (ApplePyramid, ObjectSelected, level)
concat_obj (LaplasPyramid, ObjectSelected, LaplasPyramid)
for i := level to 2 by -1
    select_obj (ApplePyramid, ObjectSelected, i)
    *zoom_image_factor (ObjectSelected, ImageZoomed, 1.0/scaleSize, 1.0/scaleSize, 'weighted')
    select_obj (ApplePyramid, ObjectSelected1, i-1)
    get_image_size (ObjectSelected1, Width3, Height3)
    zoom_image_size (ObjectSelected, ImageZoomed, Width3, Height3, 'weighted')
    sub_image (ObjectSelected1, ImageZoomed, ImageSub, 1, 0)
    concat_obj (LaplasPyramid, ImageSub, LaplasPyramid)
endfor
copy_obj (LaplasPyramid, AppleLaplasPyramid, 1, -1)

* 左右两半拼接
count_obj (AppleLaplasPyramid, Number1)
gen_empty_obj (ImageResult)
for i := 1 to Number1 by 1
    select_obj (AppleLaplasPyramid,AppleSelected, i)
    select_obj (OrangeLaplasPyramid, OrangeSelected, i)
    get_image_size (AppleSelected, Width2, Height2)
    gen_empty_obj (ImageConcat)
    concat_obj (ImageConcat, AppleSelected, ObjectsConcat)
    concat_obj (ObjectsConcat, OrangeSelected, ObjectsConcat)
    tile_images_offset (ObjectsConcat, TiledImage, [0,0], [0,Width2/2], [0,0], [0,Width2/2], [Height2,Height2], [Height2,Height2], Width2, Height2)
    concat_obj (ImageResult, TiledImage, ImageResult)
endfor


* 重建图像
count_obj (ImageResult, Number)
gen_empty_obj (ResImage)
select_obj (ImageResult, ResImage, 1)
for Index := 2 to Number by 1
    *zoom_image_factor (ResImage, ImageZoomed, 1.0/scaleSize, 1.0/scaleSize, 'weighted')
    select_obj (ImageResult, ObjectSelected1, Index)
    get_image_size (ObjectSelected1, Width4, Height4)
    zoom_image_size (ResImage, ImageZoomed, Width4, Height4, 'weighted')
    add_image (ImageZoomed, ObjectSelected1, ResImage, 1, 0)
endfor
min_max_gray (ResImage, ResImage, 0, Min, Max, Range)
mult := 255/(Max-Min)
add := -mult*Min
scale_image (ResImage, ImageScaled, mult, add)
convert_image_type (ImageScaled, ImageConverted, 'byte')

* 直接拼接
get_image_size (Apple, Width2, Height2)
gen_empty_obj (ImageConcat)
concat_obj (ImageConcat, Apple, ObjectsConcat)
concat_obj (ObjectsConcat, Orange, ObjectsConcat)
tile_images_offset (ObjectsConcat, TiledImage, [0,0], [0,Width2/2], [0,0], [0,Width2/2], [Height2,Height2], [Height2,Height2], Width2, Height2)

结果

纯halcon实现拉普拉斯图像融合_第1张图片
纯halcon实现拉普拉斯图像融合_第2张图片

直接拼接:
纯halcon实现拉普拉斯图像融合_第3张图片
利用拉普拉斯融合:
纯halcon实现拉普拉斯图像融合_第4张图片

你可能感兴趣的:(图像处理,计算机视觉,halcon,图像融合)