解释如下代码:for pic_id1 in range(1,N_pic+1): print('matching ' + set_name +': ' +str(pic_id1).zfill(5)) N_CHANGE = 0 for T_id in range(1,16,3): for H_id in range(2,5): FAIL_CORNER = 0 data_mat1 = read_data(input_file,pic_id1,T_id,H_id) search_list = range( max((pic_id1-10),1),pic_id1)+ range(pic_id1+1, min((pic_id1 + 16),N_pic + 1 ) ) for cor_ind in range(0,N_cor): row_cent1 = cor_row_center[cor_ind] col_cent1 = cor_col_center[cor_ind] img_corner = data_mat1[(row_cent1-N_pad): (row_cent1+N_pad+1), (col_cent1-N_pad): (col_cent1+N_pad+1) ] if ((len(np.unique(img_corner))) >2)&(np.sum(img_corner ==1)< 0.8*(N_pad2+1)**2) : for pic_id2 in search_list: data_mat2 = read_data(input_file,pic_id2,T_id,H_id) match_result = cv2_based(data_mat2,img_corner) if len(match_result[0]) ==1: row_cent2 = match_result[0][0]+ N_pad col_cent2 = match_result[1][0]+ N_pad N_LEF = min( row_cent1 , row_cent2) N_TOP = min( col_cent1, col_cent2 ) N_RIG = min( L_img-1-row_cent1 , L_img-1-row_cent2) N_BOT = min( L_img-1-col_cent1 , L_img-1-col_cent2) IMG_CHECK1 = data_mat1[(row_cent1-N_LEF): (row_cent1+N_RIG+1), (col_cent1-N_TOP): (col_cent1+N_BOT+1) ] IMG_CHECK2 = data_mat2[(row_cent2-N_LEF): (row_cent2+N_RIG+1), (col_cent2-N_TOP): (col_cent2+N_BOT+1) ] if np.array_equal(IMG_CHECK1,IMG_CHECK2) : check_row_N = IMG_CHECK1.shape[0] check_col_N = IMG_CHECK1.shape[1] if (check_col_Ncheck_row_N>=25): match_all.append( (pic_id1, row_cent1, col_cent1, pic_id2 , row_cent2, col_cent2) ) search_list.remove(pic_id2) else: FAIL_CORNER = FAIL_CORNER +1 N_CHANGE = N_CHANGE + 1 #%% break if less than 1 useless corners, or have detected more than 10 images from 60 if(FAIL_CORNER <= 1): break
时间: 2023-11-23 12:06:55 浏览: 67
关于图像比较的小代码
4星 · 用户满意度95%
这段代码是一个嵌套的循环结构,用于在多张图像之间进行匹配,并将匹配结果存储在列表match_all中。
具体地,外层循环是对图像编号pic_id1进行遍历,其中pic_id1的取值范围是1到N_pic,每次循环开始时会输出一行提示信息,格式为“matching + set_name + : + pic_id1的值(5位数字,前面用0填充)”。
内层循环是对图像中的角点进行遍历,其中T_id的取值范围是1到15,步长为3,H_id的取值范围是2到4,表示在图像的第T_id个特征点和第H_id个金字塔层的角点处进行匹配。
在内层循环的每次迭代中,首先调用read_data函数从图像文件中读取数据,然后使用range函数生成一个搜索列表search_list,其中包含了当前图像之前10张和之后15张图像的编号,这些图像将被用来与当前图像进行匹配。
接着对每个角点进行处理,首先计算角点的中心坐标row_cent1和col_cent1,然后从data_mat1中提取一个大小为(N_pad2+1)×(N_pad2+1)的小图像img_corner,其中N_pad是一个参数,表示小图像的大小。
如果提取的小图像中的像素值不止两种,并且像素值为1的像素数小于小图像总像素数的80%,则开始在搜索列表中的图像中寻找与该小图像匹配的图像,这里使用了cv2_based函数进行图像匹配。
如果找到了一个与小图像匹配的图像,则计算该图像对应的角点的中心坐标row_cent2和col_cent2,然后将两个图像中以两个角点为中心,大小相同的区域提取出来,分别存储在IMG_CHECK1和IMG_CHECK2中。
如果IMG_CHECK1和IMG_CHECK2相等,且它们的大小都不小于25×25,则将当前匹配结果的信息(两个图像的编号以及两个角点的中心坐标)添加到match_all列表中,同时将已匹配的图像从搜索列表中移除。
如果在内层循环的所有迭代中都没有找到与当前角点匹配的图像,则将FAIL_CORNER计数器加一,表示当前角点无法匹配,同时将N_CHANGE计数器加一。
内层循环结束后,会检查FAIL_CORNER的值是否小于等于1,如果是,则跳出外层循环,否则继续下一次循环。这个判断的目的是在不需要再进行匹配的情况下尽早结束循环,以提高代码效率。
阅读全文