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

前言

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

代码

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)

结果

苹果
在这里插入图片描述

直接拼接:
在这里插入图片描述
利用拉普拉斯融合:
在这里插入图片描述

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值