Reel图像拼接算法

基于模板匹配的图像拼接:(halcon版本)
图片0:
在这里插入图片描述
图片1:
在这里插入图片描述
拼接结果:
在这里插入图片描述

图像预处理函数:processImage (TiledImage0, ImageScaled00)

illuminate (Image0, ImageIlluminate, 101, 101, 0.7)
median_image (ImageIlluminate, ImageMedian, 'circle', 11, 'mirrored')
scale_image_max (ImageMedian, ImageScaleMax)
return ()

halcon代码-00 01拼接:(加权融合消除拼接缝)

* Image Acquisition 01: Code generated by Image Acquisition 01
ImageFiles := []
ImageFiles[0] := './195-0.jpg'
ImageFiles[1] := './195-1.jpg'
read_image (Image0, ImageFiles[0])
read_image (Image1, ImageFiles[1])

**中值滤波
processImage (Image0, ImageScaleMax)

illuminate (Image1, ImageIlluminate1, 101, 101, 0.7)
median_image (ImageIlluminate1, ImageMedian1, 'circle', 11, 'mirrored')
scale_image_max (ImageMedian1, ImageScaleMax1)

get_image_size (Image0, Width, Height)
get_image_size (Image1, Width1, Height1)
dev_set_draw ('margin')
dev_get_window (WindowHandle)
*create model
gen_region_runs (ROI_0, [72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614], [1041,1028,1016,1003,996,994,992,990,988,986,984,982,980,978,976,974,972,970,968,967,967,967,967,967,967,967,967,967,967,967,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,977,977,977,977,977,977,977,977,977,977,977,977,976,974,973,972,970,969,968,966,965,964,962,961,960,958,957,956,954,953,949,943,937,931,925,919,913,906,900,894,888,882,876,872,872,871,871,870,870,869,869,868,868,867,867,866,866,865,865,864,864,863,863,862,862,861,861,860,860,859,859,858,858,857,857,857,856,856,855,855,854,854,853,853,852,852,851,851,850,850,849,849,848,848,847,847,846,846,845,845,844,844,843,843,842,842,841,841,841,840,840,839,839,838,838,837,837,836,836,835,835,834,834,833,833,832,832,831,831,830,830,829,829,828,828,827,827,826,826,826,825,825,824,824,823,823,822,822,821,821,820,820,819,819,818,818,817,817,816,816,815,815,814,814,813,813,812,812,811,811,811,810,810,809,809,808,808,807,807,806,806,805,805,804,804,803,803,802,802,801,801,800,800,799,799,798,798,797,797,796,796,795,795,795,794,794,793,793,792,792,791,791,790,790,789,789,788,788,787,787,786,786,785,785,784,784,783,783,782,782,781,781,780,780,780,779,779,778,778,777,777,776,776,775,775,774,774,773,773,772,772,771,771,770,770,769,769,768,768,767,767,766,766,765,765,764,764,764,763,763,762,762,761,761,760,760,759,759,758,758,757,757,756,756,755,755,754,754,753,753,752,752,751,751,750,750,749,749,759,777,795,813,831,849,868,886,904,922,940,959,977,995,1013,1031,1049], [1053,1066,1080,1093,1100,1100,1100,1100,1100,1101,1101,1101,1101,1101,1101,1101,1101,1102,1102,1102,1102,1102,1102,1102,1102,1103,1103,1103,1103,1103,1103,1103,1103,1104,1104,1104,1104,1104,1104,1104,1104,1105,1105,1105,1105,1105,1105,1105,1105,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1107,1106,1104,1103,1102,1101,1099,1098,1097,1095,1094,1092,1089,1087,1084,1081,1078,1076,1073,1070,1067,1064,1062,1059])

reduce_domain (ImageScaleMax, ROI_0, ImageReduced1)
create_ncc_model (ImageReduced1, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
find_ncc_model (ImageScaleMax, ModelID, -0.39, 0.79, 0.8, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
dev_display_ncc_matching_results (ModelID, 'red', Row, Column, Angle, 0)

find_ncc_model (ImageScaleMax1, ModelID, -0.39, 0.79, 0.4, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
dev_display_ncc_matching_results (ModelID, 'red', Row, Column, Angle, 0)

*test
count_seconds (t1)
tile_images (Image0, TiledImage0, 2, 'vertical')
tile_images (Image1, TiledImage1, 2, 'vertical')
processImage (TiledImage0, ImageScaled00)
processImage (TiledImage1, ImageScaled11)

find_ncc_model (ImageScaled00, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row2, Column2, Angle2, Score2)
dev_display_ncc_matching_results (ModelID, 'red', Row2, Column2, Angle2, 0)
*find1
find_ncc_model (ImageScaled11, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row1, Column1, Angle1, Score1)
dev_display_ncc_matching_results (ModelID, 'red', Row1, Column1, Angle1, 0)
find_ncc_model (Image1, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row3, Column3, Angle3, Score3)
dev_display_ncc_matching_results (ModelID, 'red', Row3, Column3, Angle3, 0)
*1-0
vector_angle_to_rigid (Row1, Column1, Angle1, Row2, Column2, Angle2, HomMat2D)
affine_trans_image (TiledImage1, ImageAffineTrans, HomMat2D, 'constant', 'false')
*右拼接1
* threshold (TiledImage0, Region1, 1, 255)
get_region_points (TiledImage0, Rows1, Columns1)
get_grayval (TiledImage0, Rows1, Columns1, Grayval1)
gen_image_proto (TiledImage0, ImageCleared1, 0)
set_grayval (ImageCleared1, Rows1, Columns1, Grayval1)
*右拼接2-右拼接1
* threshold (ImageAffineTrans, Region, 1, 255)
difference (ImageAffineTrans, TiledImage0, RegionDifference)
get_region_points (RegionDifference, Rows, Columns)
get_grayval (ImageAffineTrans, Rows, Columns, Grayval)
*拼接
set_grayval (ImageCleared1, Rows, Columns, Grayval)
*重新计算权重
**左侧
* copy_image (Image0, DupImage)
**右侧
vector_angle_to_rigid (Row3, Column3, Angle3, Row, Column, Angle, HomMat2D1)
affine_trans_image (Image1, ImageAffineTrans1, HomMat2D, 'constant', 'false')
**重叠区域
threshold (ImageAffineTrans1, Region, 1, 255)
smallest_rectangle1 (Region, Row11, Column11, Row21, Column21)
processWidth:=Column21-Column11
**计算权重
get_region_points (Region, Rows2, Columns2)
tuple_sub (Columns2, Column11, Diff)
tuple_div ((processWidth-Diff)*1.0, processWidth, alpha)
**加权融合
get_grayval (Image0, Rows2, Columns2, Grayval2)
get_grayval (ImageAffineTrans1, Rows2, Columns2, Grayval3)
grayvalNewLeft:=Grayval2*alpha
grayvalNewRight:=Grayval3*(1-alpha)
grayvalNew:=grayvalNewLeft+grayvalNewRight
set_grayval (ImageCleared1, Rows2, Columns2, grayvalNew)
count_seconds (t2)
time:=t2-t1
disp_message (WindowHandle, time, 'window', 10, 10, 'red', 'true')
* write_image (ImageCleared1, 'jpg', 0, 'E:/project/Reel/拼接图/Mosaic-new1/mosaicImage01')
stop ()
* Image Acquisition 02: Code generated by Image Acquisition 02
list_files ('E:/project/Reel/盛和/盛和-张强交接文档/reel2reel/陈博-拼接图/陈博/-0+-1', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 2
    * Image Acquisition 02: Do something
    parse_filename (ImageFiles[Index], BaseName, Extension, Directory)
    parse_filename (ImageFiles[Index+1], BaseName1, Extension1, Directory1)
    tuple_split (BaseName, '-', Substrings)
    tuple_split (BaseName1, '-', Substrings1)
    if (Substrings[0]==Substrings1[0] and Substrings[1]==Substrings1[1])
        read_image (Image0, ImageFiles[Index])
        read_image (Image1, ImageFiles[Index+1])
        mosaic_image (Image0, Image1, ImageMosaic, ModelID)
        
    endif
    wait_seconds (0.5)
endfor
stop ()



*整体拼接
ImageFiles1 := []
ImageFiles1[0] := 'E:/project/Reel/盛和/盛和-张强交接文档/reel2reel/陈博-拼接图/陈博/00000.jpg'
ImageFiles1[1] := 'E:/project/Reel/盛和/盛和-张强交接文档/reel2reel/陈博-拼接图/陈博/00002.jpg'
read_image (Image00, ImageFiles1[0])
read_image (Image11, ImageFiles1[1])

gen_empty_obj (EmptyObject)
concat_obj (EmptyObject, Image11, EmptyObject)
concat_obj (EmptyObject, Image00, EmptyObject)
tile_images (EmptyObject, TiledImage, 1, 'vertical')


封装拼接算法:mosaic_image (Image0, Image1, ImageMosaic, ModelID)

tile_images (Image0, TiledImage0, 2, 'vertical')
tile_images (Image1, TiledImage1, 2, 'vertical')
get_image_size (TiledImage0, Width, Height)
grayLow := 150
grayHigh := 255
scale_image_range (TiledImage0, ImageScaled00, grayLow, grayHigh)
scale_image_range (TiledImage1, ImageScaled11, grayLow, grayHigh)
* find0
gen_rectangle1 (Rectangle, 0, Width/5, Height/2, Width/2)
reduce_domain (ImageScaled00, Rectangle, ImageReduced)
find_ncc_model (ImageReduced, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row2, Column2, Angle2, Score2)
dev_display_ncc_matching_results (ModelID, 'red', Row2, Column2, Angle2, 0)
* find1
gen_rectangle1 (Rectangle1, 0, 0, Height/2, Width/3)
reduce_domain (ImageScaled11, Rectangle1, ImageReduced1)
find_ncc_model (ImageReduced1, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row1, Column1, Angle1, Score1)
dev_display_ncc_matching_results (ModelID, 'red', Row1, Column1, Angle1, 0)
* 1-0
vector_angle_to_rigid (Row1, Column1, Angle1, Row2, Column2, Angle2, HomMat2D)
affine_trans_image (TiledImage1, ImageAffineTrans, HomMat2D, 'constant', 'false')
* 右拼接1
* threshold (TiledImage0, Region1, 1, 255)
get_region_points (TiledImage0, Rows1, Columns1)
get_grayval (TiledImage0, Rows1, Columns1, Grayval1)
gen_image_proto (TiledImage0, ImageCleared1, 0)
set_grayval (ImageCleared1, Rows1, Columns1, Grayval1)
* 右拼接2-右拼接1
* threshold (ImageAffineTrans, Region, 1, 255)
difference (ImageAffineTrans, TiledImage0, RegionDifference)
get_region_points (RegionDifference, Rows, Columns)
get_grayval (ImageAffineTrans, Rows, Columns, Grayval)
* 拼接
set_grayval (ImageCleared1, Rows, Columns, Grayval)
return ()

halcon代码-02 03拼接:

在这里插入图片描述
拼接结果:
在这里插入图片描述
02-03拼接代码:

* Image Acquisition 01: Code generated by Image Acquisition 01
ImageFiles := []
ImageFiles[0] := './195-3.jpg'
ImageFiles[1] := './195-2.jpg'
read_image (Image0, ImageFiles[0])
read_image (Image1, ImageFiles[1])

**中值滤波
processImage (Image0, ImageScaleMax)

illuminate (Image1, ImageIlluminate1, 101, 101, 0.7)
median_image (ImageIlluminate1, ImageMedian1, 'circle', 11, 'mirrored')
scale_image_max (ImageMedian1, ImageScaleMax1)

get_image_size (Image0, Width, Height)
get_image_size (Image1, Width1, Height1)
dev_set_draw ('margin')
dev_get_window (WindowHandle)
*create model
gen_rectangle1 (ROI_0, 537.879, 728.316, 973.501, 1049.63)

reduce_domain (ImageScaleMax, ROI_0, ImageReduced1)
create_ncc_model (ImageReduced1, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
find_ncc_model (ImageScaleMax, ModelID, -0.39, 0.79, 0.8, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
dev_display_ncc_matching_results (ModelID, 'red', Row, Column, Angle, 0)

find_ncc_model (ImageScaleMax1, ModelID, -0.39, 0.79, 0.4, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
dev_display_ncc_matching_results (ModelID, 'red', Row, Column, Angle, 0)

*test
count_seconds (t1)
tile_images (Image0, TiledImage0, 2, 'vertical')
tile_images (Image1, TiledImage1, 2, 'vertical')
processImage (TiledImage0, ImageScaled00)
processImage (TiledImage1, ImageScaled11)

find_ncc_model (ImageScaled00, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row2, Column2, Angle2, Score2)
dev_display_ncc_matching_results (ModelID, 'red', Row2, Column2, Angle2, 0)
*find1
find_ncc_model (ImageScaled11, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row1, Column1, Angle1, Score1)
dev_display_ncc_matching_results (ModelID, 'red', Row1, Column1, Angle1, 0)
find_ncc_model (Image1, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row3, Column3, Angle3, Score3)
dev_display_ncc_matching_results (ModelID, 'red', Row3, Column3, Angle3, 0)
*1-0
vector_angle_to_rigid (Row1, Column1, Angle1, Row2, Column2, Angle2, HomMat2D)
affine_trans_image (TiledImage1, ImageAffineTrans, HomMat2D, 'constant', 'false')
*右拼接1
* threshold (TiledImage0, Region1, 1, 255)
get_region_points (TiledImage0, Rows1, Columns1)
get_grayval (TiledImage0, Rows1, Columns1, Grayval1)
gen_image_proto (TiledImage0, ImageCleared1, 0)
set_grayval (ImageCleared1, Rows1, Columns1, Grayval1)
*右拼接2-右拼接1
* threshold (ImageAffineTrans, Region, 1, 255)
difference (ImageAffineTrans, TiledImage0, RegionDifference)
get_region_points (RegionDifference, Rows, Columns)
get_grayval (ImageAffineTrans, Rows, Columns, Grayval)
*拼接
set_grayval (ImageCleared1, Rows, Columns, Grayval)
*重新计算权重
**左侧
* copy_image (Image0, DupImage)
**右侧
vector_angle_to_rigid (Row3, Column3, Angle3, Row, Column, Angle, HomMat2D1)
affine_trans_image (Image1, ImageAffineTrans1, HomMat2D, 'constant', 'false')
**重叠区域
threshold (ImageAffineTrans1, Region, 1, 255)
smallest_rectangle1 (Region, Row11, Column11, Row21, Column21)
processWidth:=Column21-Column11
**计算权重
get_region_points (Region, Rows2, Columns2)
tuple_sub (Columns2, Column11, Diff)
tuple_div ((processWidth-Diff)*1.0, processWidth, alpha)
**加权融合
get_grayval (Image0, Rows2, Columns2, Grayval2)
get_grayval (ImageAffineTrans1, Rows2, Columns2, Grayval3)
grayvalNewLeft:=Grayval2*alpha
grayvalNewRight:=Grayval3*(1-alpha)
grayvalNew:=grayvalNewLeft+grayvalNewRight
set_grayval (ImageCleared1, Rows2, Columns2, grayvalNew)
count_seconds (t2)
time:=t2-t1
disp_message (WindowHandle, time, 'window', 10, 10, 'red', 'true')
stop ()
* Image Acquisition 02: Code generated by Image Acquisition 02
list_files ('E:/project/Reel/盛和/盛和-张强交接文档/reel2reel/陈博-拼接图/陈博/-0+-1', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 2
    * Image Acquisition 02: Do something
    parse_filename (ImageFiles[Index], BaseName, Extension, Directory)
    parse_filename (ImageFiles[Index+1], BaseName1, Extension1, Directory1)
    tuple_split (BaseName, '-', Substrings)
    tuple_split (BaseName1, '-', Substrings1)
    if (Substrings[0]==Substrings1[0] and Substrings[1]==Substrings1[1])
        read_image (Image0, ImageFiles[Index])
        read_image (Image1, ImageFiles[Index+1])
        mosaic_image (Image0, Image1, ImageMosaic, ModelID)
        
    endif
    wait_seconds (0.5)
endfor
stop ()

第三次拼接:
在这里插入图片描述

*整体拼接
ImageFiles1 := []
ImageFiles1[0] := './mosaicImage01.jpg'
ImageFiles1[1] := './mosaicImage23.jpg'
read_image (Image0, ImageFiles1[0])
read_image (Image1, ImageFiles1[1])

**中值滤波
processImageMax (Image0, ImageScaleMax)
processImageMax (Image1, ImageScaleMax1)

get_image_size (Image0, Width, Height)
get_image_size (Image1, Width1, Height1)
dev_set_draw ('margin')
dev_get_window (WindowHandle)
*create model
gen_rectangle1 (ROI_0, 69.7955, 965.175, 226.924, 1321.41)

reduce_domain (ImageScaleMax, ROI_0, ImageReduced1)
create_ncc_model (ImageReduced1, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
find_ncc_model (ImageScaleMax, ModelID, -0.39, 0.79, 0.8, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
dev_display_ncc_matching_results (ModelID, 'red', Row, Column, Angle, 0)

find_ncc_model (ImageScaleMax1, ModelID, -0.39, 0.79, 0.4, 1, 0.5, 'true', 0, Row11, Column11, Angle11, Score)
dev_display_ncc_matching_results (ModelID, 'red', Row11, Column11, Angle11, 0)

*test
count_seconds (t1)
gen_image_const (ImageBlack, 'byte', Width1, Height1)
concat_obj (ImageBlack, Image0,  ObjectsConcat)
tile_images_offset (ObjectsConcat, TiledImage0, [0,Height], [0,0], [-1,-1], [-1,-1], [-1,-1], [-1,-1], Width1, Height1*2)
concat_obj (Image1, ImageBlack, ObjectsConcat1)
tile_images_offset (ObjectsConcat1, TiledImage1, [0,Height], [0,0], [-1,-1], [-1,-1], [-1,-1], [-1,-1], Width1, Height1*2)

processImageMax (TiledImage0, ImageScaled00)
processImageMax (TiledImage1, ImageScaled11)

find_ncc_model (ImageScaled00, ModelID, -1.57, 3.14, 0.2, 1, 0.5, 'true', 0, Row2, Column2, Angle2, Score2)
dev_display_ncc_matching_results (ModelID, 'red', Row2, Column2, Angle2, 0)
*find1
find_ncc_model (ImageScaled11, ModelID, -1.57, 3.14, 0.2, 1, 0.5, 'true', 0, Row1, Column1, Angle1, Score1)
dev_display_ncc_matching_results (ModelID, 'red', Row1, Column1, Angle1, 0)
find_ncc_model (Image1, ModelID, -0.39, 0.79, 0.2, 1, 0.5, 'true', 0, Row3, Column3, Angle3, Score3)
dev_display_ncc_matching_results (ModelID, 'red', Row3, Column3, Angle3, 0)
*1-0
vector_angle_to_rigid (Row1, Column1, Angle1, Row2, Column2, Angle2, HomMat2D)
affine_trans_image (TiledImage1, ImageAffineTrans, HomMat2D, 'constant', 'false')
add_image (ImageScaled00, ImageAffineTrans, ImageResult, 0.5, 0)
*右拼接1
* threshold (TiledImage0, Region1, 1, 255)
get_region_points (TiledImage0, Rows1, Columns1)
get_grayval (TiledImage0, Rows1, Columns1, Grayval1)
gen_image_proto (TiledImage0, ImageCleared1, 0)
set_grayval (ImageCleared1, Rows1, Columns1, Grayval1)
*右拼接2-右拼接1
threshold (ImageAffineTrans, RegionTrans, 1, 255)
threshold (TiledImage0, Region0, 1, 255)
difference (RegionTrans, Region0, RegionDifference)
get_region_points (RegionDifference, Rows, Columns)
get_grayval (ImageAffineTrans, Rows, Columns, Grayval)
*拼接
set_grayval (ImageCleared1, Rows, Columns, Grayval)
stop ()
*重新计算权重
**左侧
* copy_image (Image0, DupImage)
**右侧
vector_angle_to_rigid (Row3, Column3, Angle3, Row, Column, Angle, HomMat2D1)
affine_trans_image (Image1, ImageAffineTrans1, HomMat2D, 'constant', 'false')
**重叠区域
threshold (TiledImage0, Region, 1, 255)
threshold (ImageAffineTrans, Region1, 1, 255)
intersection (Region, Region1, RegionIntersection)
smallest_rectangle1 (RegionIntersection, Row11, Column11, Row21, Column21)
gen_rectangle1 (Rectangle, Row11, Column11, Row21, Column21)
LineWidth:=Column21-Column11
processHeight:=Row21-Row11
**计算权重
get_region_points (Rectangle, Rows2, Columns2)
tuple_sub (Rows2, Row11, Diff)
tmp:=(processHeight-Diff)*1.0
tuple_div ((processHeight-Diff)*1.0, processHeight, alpha)
tuple_select_range (alpha, 0, 2000, Selected)
**加权融合
get_grayval (TiledImage0, Rows2, Columns2, Grayval2)
get_grayval (ImageAffineTrans, Rows2, Columns2, Grayval3)
grayvalNewLeft:=Grayval2*(1-alpha)
tuple_select_range (grayvalNewLeft, 0, 2000, Selected)
grayvalNewRight:=Grayval3*(alpha)
grayvalNew:=grayvalNewLeft+grayvalNewRight
set_grayval (ImageCleared1, Rows2, Columns2, grayvalNew)
count_seconds (t2)
time:=t2-t1
disp_message (WindowHandle, time, 'window', 10, 10, 'red', 'true')
stop ()

C++ CUDA的拼接算法:
效果图
在这里插入图片描述
基于cuda的图像拼接代码下载地址

文章代码用到的图像数据集:
https://download.csdn.net/download/qq_34176467/89163168

批量数据集:
https://download.csdn.net/download/qq_34176467/89163185

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值