(数学建模)2013年国赛B题-碎纸片复原python代码

这篇具有很好参考价值的文章主要介绍了(数学建模)2013年国赛B题-碎纸片复原python代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数字图像处理的期末大作业

成绩出来了,感觉一般般,做个记录

代码图片文件:数学建模2013年国赛B题碎纸片复原(纵切和横纵切两问)-统计分析文档类资源-CSDN下载

目录

第一问 碎纸片拼接--纵切

以下为python代码:

结果

问题二: 碎纸片拼接--纵切+横切

python代码如下:

结果:


第一问 碎纸片拼接--纵切

  • 设计思路

通过二值化,将图片灰度转变为0-1之间(以便提高运算速率)。在此问题中题目给出了纵状的切割图片,主要的解题思路是通过计算每张图片与左边界的距离得到第一列图片的序号,然后遍历第一列的图片,为其匹配该行的图片,最终得到纵向图片拼接的序号。

  • 算法步骤
  1. 对图像进行二值化的预处理
  2. 首先,求出第一列的序号(通过比较每张图片与最左边的距离,求出第一列的序号,因为图片一般存在页边距,而第一列的图片与左边界的距离是相同的,都为页边距)
  3. 对于求出的第一列的图片序号,求与其边缘匹配指数最高的图片,即为下一图片序号,通过计算下一图片的与其边缘匹配指数最高的图片为其下一图片序号。依次遍历得到最终的图片拼接排序。其中,边缘匹配指数为左边图片的最右边一列像素和右边匹配图片的最左边一列像素相等的个数。

以下为python代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import skimage.io as io
from collections import Counter
from PIL import Image

data_dir = './附件1'
path = data_dir +'/*.bmp'
coll = io.ImageCollection(path)#读入灰度图像
img_num = len(coll)
#*********转矩阵*******
img = np.asarray(coll)
for i in range(0,len(coll)):
    img[i] = cv2.adaptiveThreshold(src=img[i],                                     # 要进行处理的图片
                                       maxValue=1,                                # 大于阈值后设定的值
                                       adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,   # 自适应方法,ADAPTIVE_THRESH_MEAN_C:表区域内均值;ADAPTIVE_THRESH_GAUSSIAN_C:表区域内像素点加权求和
                                       thresholdType=cv2.THRESH_BINARY,             # 同全局阈值法中的参数一样
                                       blockSize=11,                                # 方阵(区域)大小,
                                       C=1)                                         # 常数项,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
coll[0].shape
#计算与左边距离  选出第一张图片
Max = -1
index = 0
for i in range(0,img.shape[0]):
    #计算
    count = 0
    for y in range(0,img.shape[2]):#图片按列便利
        panduan = 1
        for x in range(0,img.shape[1]):
            if(img[i][x][y]==0):
                panduan = 0
                break
        if(panduan==1):
            count = count+1
        else:
            break
    if(count>Max):
        Max = count
        index = i
#计算每一张的右边边缘  检测最匹配的图片
ans_index = [] #用于记录最终的排序
ans_index.append(index) #插入第一张图片的索引
#计算每一张的边缘  左和右  相匹配的值
while(1):
    Max = -1
    index = 0
    zj = ans_index[len(ans_index)-1]
    print(ans_index)
    for i in range(0,len(coll)):
        if(ans_index.count(i)==1):
            continue
        count = 0
        for x in range(0,img.shape[1]):#遍历行遍历  左右元素
            if(img[i][x][0]==img[zj][x][img.shape[2]-1]):
                count = count + 1
        if(count>Max):
            Max = count
            index = i
    ans_index.append(index)
    print(ans_index)
    if(len(ans_index)==len(coll)):
        break

ans_img = coll[ans_index[0]]
for i in range(0,len(ans_index)):
    if(i==0):
        continue
    ans_img = np.hstack((ans_img, coll[ans_index[i]]))  # 水平合并
ans_img.shape
im = Image.fromarray(ans_img)  # to Image
im.save('result1.png')

代码运行结果:

结果

通过上述算法计算得到附件1的图片拼接顺序如下:

[8, 14, 12, 15, 3, 10, 2, 16, 1, 4, 5, 9, 13, 18, 11, 7, 17, 0, 6]

最终拼接得到的图片如下所示(result1.png文件):

2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv

通过上述算法计算得到附件2的图片拼接顺序如下:

 [3, 6, 2, 7, 15, 18, 11, 0, 5, 1, 9, 13, 10, 8, 12, 14, 17, 16, 4]

最终拼接得到的图片如下所示(result2.png文件):

2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv

问题二: 碎纸片拼接--纵切+横切

  • 设计思路

相较于第一问,第二问的碎片加入了纵向的切割,且通过观察样本,可以得知有些图片存在空白行边缘,行与行之间有固定的间隔。本文先对图片中字的位置做特征提取,运用K-meanes聚类算法分出11类。得到每行的分类,对行内类元素进行相似度匹配排序。将行内排序好了的11行图片依据图片边缘相似度和行间距匹配度进行竖直方向的拼接。

  • 算法步骤
  1. 对图像进行二值化处理
  2. 计算图片的行列数,求第一行、最后一行、第一列、最后一列的图像序号

通过对附件3所有图片计算图片与左边界的距离,得到11张距离相同、最大的图片作为第一列,同样计算图片与右边界的距离得到11张最后一列的图片序列。

其中,第一行和最后一行的计算可以在行聚类之后计算每行与底部的空白距离,也可以在此步骤进行计算,本文选择在聚类之后进行计算第一行和最后一行图片的序号。

        3、对图像做掩码处理

图片存在首行缩进、段尾,会对行间的聚类有较大的影响,所以对这类图片进行掩码处理。首先计算统计出所有图片的空白行高度和字体高度,通过统计得到字宽和行宽,通过得到的字宽和行宽对以下三种图像进行掩码处理。如下为三种行空白掩码处理的结果:

 2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv    2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv    2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv           

        4、特征提取

选择图片字像素所在的行数作为特征进行提取,如下图所示的红线即为该图片特征提取行数的示例图:

2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv

对于中文和英文碎片来说,其行间特征有不同,具体如图所示:

2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv

        4、聚类

运用K-means算法进行聚类,可以得到11类行间类图片。

        5、根据左右相似度进行行内排序,通过比较行间上下边缘相似度和上下行间距进行竖直方向的行间拼接。

其中相似度函数通过两个因素进行判断,一个是一行中归一化后灰度值为0的个数,一个是两行中像素相等的值,通过调整loss函数中两个因素的系数,计算相似度的值。

对于中文来说,特征提取可以直接统计该行灰度值是否等于列数,用于区分该位置(行)为空白行部分或文字部分;而对于英文的特征提取则需要用到灰度变化的斜率,当斜率大于一定值为空白行和字的交界处,从而用于判断提取空白行、文字位置特征。

python代码如下:


import cv2
import numpy as np
import matplotlib.pyplot as plt
import skimage.io as io
from collections import Counter
from PIL import Image
import pandas as pd

from sklearn.cluster import KMeans#导入聚类模型

data_dir = './附件3'
path = data_dir +'/*.bmp'
coll = io.ImageCollection(path)#读入灰度图像
img_num = len(coll)
#*********转矩阵*******
img = np.asarray(coll)
for i in range(0,len(coll)):
    img[i] = cv2.adaptiveThreshold(src=img[i],                                     # 要进行处理的图片
                                        maxValue=1,                                # 大于阈值后设定的值
                                        adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,   # 自适应方法,ADAPTIVE_THRESH_MEAN_C:表区域内均值;ADAPTIVE_THRESH_GAUSSIAN_C:表区域内像素点加权求和
                                        thresholdType=cv2.THRESH_BINARY,             # 同全局阈值法中的参数一样
                                        blockSize=11,                                # 方阵(区域)大小,
                                        C=1)                                         # 常数项,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
print(img.shape)


#*******计算每张图片的左右边距*****
left = []
right = []
for i in range(0,img.shape[0]):
    #计算每张图片同左边的距离
    count = 0
    for y in range(0,img.shape[2]):#列
        panduan = 1
        for x in range(0,img.shape[1]):#行
            if(img[i][x][y]==0):
                panduan = 0
                break
        if(panduan==1):
            count = count+1
        else:
            break
    left.append(count)
    #计算每张图片同右边的距离
    count = 0
    for y in range(img.shape[2]-1, -1, -1):#列
        panduan = 1
        for x in range(0,img.shape[1]):#行
            if(img[i][x][y]==0):
                panduan = 0
                break
        if(panduan==1):
            count = count+1
        else:
            break
    right.append(count)
plt.scatter(range(0,len(left)),left)
plt.scatter(range(0,len(right)),right)
print(Counter(left))
print(Counter(right))
#*****确定行数********
#可以从图中找到11个最右边和最左边的图片
#剩余的点 中可以计算  行间距

#从散点图可以看出  行数为11
#列数为  209/11 = 19  209为img.shape[0]
fenge = 10  #看图确定  或  通过计算得出count的平均值
col = 19  #列数
row = 11  #行数  left  或 right 中count值大于 fenge的个数
#**********最后一列图片***********
end_index = []
for i in range(0,len(right)):
    if(right[i]>=fenge):
        end_index.append(i)
len(end_index)

#**********找出第一列的图片index*******
first_index = []
for i in range(0,len(left)):
    if(left[i]>=fenge):
        first_index.append(i)
len(first_index)

kong_width = []
zi_width = []
#********计算每张图片连续的1和0的长度********
for i in range(0,img.shape[0]):
    width = 0
    zj_kong = []
    zj_zi = []
    if(sum(img[i][0])==img.shape[2]):#空白行
        qian = 0
    else:
        qian = 1
    for x in range(0,img.shape[1]):
        if(sum(img[i][x])!=img.shape[2]):#字
            xian = 0
        else:
            xian = 1
        if(qian!=xian):
            if(qian == 0):
                if(width):
                    zj_zi.append(width)
            else:
                if(width):
                    zj_kong.append(width)
            width = 0
        else:
            width = width + 1
        qian = xian
    if(qian==0):#最后一行处理
        zj_zi.append(width)
    else:
        zj_kong.append(width)
    kong_width.append(zj_kong)
    zi_width.append(zj_zi)

print(kong_width[0])
print(zi_width[0])
#统计分析
#得出字宽为40、39、38  空白行宽度为27、26、28
ans = []
for i in kong_width:
    for j in i:
        ans.append(j)
plt.scatter(range(0,len(ans)),ans)
print("空白行宽度统计:"+str(Counter(ans)))
ans = []
for i in zi_width:
    for j in i:
        ans.append(j)
plt.scatter(range(0,len(ans)),ans)
print("字宽统计:"+str(Counter(ans)))
img1 = img
#掩码补全    对于段首空行和段尾空行处理  为聚类做预处理
chuli_index_1 = []#需处理的图片 index  分为两种情况  如果需处理的行在第一行 需找到下界字的边缘行数
chuli_index_2 = []#如果不在第一行  需找到上界字的边缘行数
count = 0
for i in kong_width:
    index = 0
    for j in i:
        if(j>40):
            if(index==0):
                chuli_index_1.append(count)
            else:
                chuli_index_2.append(count)
            break
        index = index + 1
    count = count + 1
print("进行掩码处理的图片数量:"+str(len(chuli_index_1)+len(chuli_index_2)))
print("第一类需掩码处理的图片数量"+str(len(chuli_index_1)))
print("第二类需掩码处理的图片数量"+str(len(chuli_index_2)))
#处理
#第一种情况 需找到下界字的边缘行数
for index in chuli_index_1:
    #找到第一行
    first_index_ = 0
    for x in range(0,img.shape[1]):#行
        if(sum(img[index][x])!=img.shape[2]):
            break
        first_index_ = x
    if(x-27-40<0):
        first = 0
    else:
        first = int(x-27-40)
    for x in range(first,x-27):
        for y in range(0,img.shape[2]):
            img1[index][x][y] = 0
#第二种情况 需找到上界字的边缘行数
for index in chuli_index_2:
    #找到上界行数
    width = 0
    zj_kong = []
    hang = []
    zj_zi = []
    if(sum(img[index][0])==img.shape[2]):#空白行
        qian = 0
    else:
        qian = 1
    for x in range(0,img.shape[1]):
        if(sum(img[index][x])!=img.shape[2]):#字
            xian = 0
        else:
            xian = 1
        if(qian!=xian):
            if(qian == 0):
                if(width):
                    zj_zi.append(width)
            else:
                if(width):
                    zj_kong.append(width)
                    hang.append(x)
            width = 0
        else:
            width = width + 1
        qian = xian
    if(qian==0):#最后一行处理
        zj_zi.append(width)
    else:
        zj_kong.append(width)
        hang.append(x)
    Max = 0
    for i in range(0,len(zj_kong)):
        if(zj_kong[i]>Max):
            Max = zj_kong[i]
            first_index_ = hang[i]-zj_kong[i]
    if(first_index_+27+40>=img.shape[1]):
        end = img.shape[1]
    else:
        end = first_index_ + 27 + 40
    for x in range(first_index_+27,end):
        for y in range(0,img.shape[2]):
            img1[index][x][y] = 0
#***********聚类***********
#提取特征
tezhe = []
for i in range(0,img.shape[0]):
    width = 0
    zj = []
    if(sum(img1[i][0])==img.shape[2]):#空白行
        qian = 0
    else:
        qian = 1
    for x in range(0,img.shape[1]):
        if(sum(img1[i][x])!=img.shape[2]):#字
            xian = 0
        else:
            xian = 1
        if(qian!=xian):
            if(width>10):#防止出现  文字中间有间隔部分的情况
                zj.append(x)
            width = 0
        else:
            width = width + 1
        qian = xian
    tezhe.append(zj) 
ans = []
for i in range(0,len(tezhe)):
    zj = []
    zj.append(tezhe[i][0])
    zj.append(tezhe[i][1])
    # zj.append(tezhe[i][2])
    # zj.append(tezhe[i][3])
    ans.append(zj)

x_train = pd.DataFrame(ans)
kmeansmodel = KMeans(n_clusters=11, init='k-means++')
y_kmeans = kmeansmodel.fit_predict(x_train)  
print("聚类结果统计:"+str(Counter(y_kmeans)))

#分类结果
ans = {}
count = 0
for i in y_kmeans:
    if(i in ans.keys()):
        ans[i].append(count)
    else:
        zj = []
        zj.append(count)
        ans[i] = zj
    count += 1
ans_lei = ans
#*******行内排序******
img1 = img
img = np.asarray(coll)
for i in range(0,len(coll)):
    img[i] = cv2.adaptiveThreshold(src=img[i],                                     # 要进行处理的图片
                                        maxValue=1,                                # 大于阈值后设定的值
                                        adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,   # 自适应方法,ADAPTIVE_THRESH_MEAN_C:表区域内均值;ADAPTIVE_THRESH_GAUSSIAN_C:表区域内像素点加权求和
                                        thresholdType=cv2.THRESH_BINARY,             # 同全局阈值法中的参数一样
                                        blockSize=11,                                # 方阵(区域)大小,
                                        C=1)                                         # 常数项,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
hang_index = []
for i in range(0,len(ans_lei)):
    ans_index = [] #用于记录的排序
    ans_index.append(first_index[i]) #插入第一张图片的索引
    count1 = 0
    while(count1<len(ans_lei[y_kmeans[first_index[i]]])-2):
        count1 = count1 + 1
        Max = -1
        index = 0
        zj = ans_index[len(ans_index)-1]
        for j in ans_lei[y_kmeans[first_index[i]]]:
            if(ans_index.count(j)==1 or end_index.count(j)==1):
                if(end_index.count(j)==1):
                    yc = j
                continue
            count = 0
            for x in range(0,img.shape[1]):#遍历行遍历  左右元素
                if(img[j][x][0]==img[zj][x][img.shape[2]-1] ):
                    if(img[j][x][0]==0):
                        count +=0.6
                    count = count + 1
            count2 = abs(sum(img[j][0])-sum(img[zj][img.shape[1]-1]))
            loss = count*0.5 -count1*0.8
            if(loss>Max):
                Max = loss
                index = j
        ans_index.append(index)
    ans_index.append(yc)
    print(ans_index)
    hang_index.append(ans_index)
#******按行拼接图片查看效果********排序效果很好
ans_hang_img = []
for i in range(0,len(hang_index)):
    ans_img = coll[hang_index[i][0]]
    for j in range(0,len(hang_index[i])):
        if(j==0):
            continue
        ans_img = np.hstack((ans_img, coll[hang_index[i][j]]))  # 水平合并
    ans_hang_img.append(ans_img)
im = Image.fromarray(ans_hang_img[5])  # to Image
img_ = np.array(ans_hang_img)
img_.shape#11行图片

#二值化  加快运算速度
for i in range(0,len(img_)):
    img_[i] = cv2.adaptiveThreshold(src=img_[i],                                     # 要进行处理的图片
                                        maxValue=1,                                # 大于阈值后设定的值
                                        adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,   # 自适应方法,ADAPTIVE_THRESH_MEAN_C:表区域内均值;ADAPTIVE_THRESH_GAUSSIAN_C:表区域内像素点加权求和
                                        thresholdType=cv2.THRESH_BINARY,             # 同全局阈值法中的参数一样
                                        blockSize=11,                                # 方阵(区域)大小,
                                        C=1)                                         # 常数项,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数

#*******将以上拼接好的行图片进行竖方向的拼接
#***找到第一行index
Max = 0
first_hang_index = 0
for i in range(0,img_.shape[0]):
    #计算每张行图片同顶部的距离
    for x in range(0,img_.shape[1]):#行
        if(sum(img_[i][x])!=img_.shape[2]):
            if(x>Max):
                Max = x
                first_hang_index = i
            break
#***找到最后一行index
Max = 0
end_hang_index = 0
for i in range(0,img_.shape[0]):
    #计算每张行图片同顶部的距离
    for x in range(img_.shape[1]-1,-1,-1):#行
        if(sum(img_[i][x])!=img_.shape[2]):
            if(179-x>Max):
                Max =179- x
                end_hang_index = i
            break
#列排序
lie_index = []
lie_index.append(first_hang_index)#行排序  列的第一个  行图片index
while(1):
    Max = -1
    index = 0
    zj = lie_index[len(lie_index)-1]  
    for j in range(0,img_.shape[0]):
        if(lie_index.count(j)==1 or j == end_hang_index):
            continue
        count = 0
        for y in range(0,img_.shape[2]):#遍历行遍历 
            if(img_[j][0][y]==img_[zj][img_.shape[1]-1][y] ):
                if(img_[j][0][y]==0):
                    count +=0.3
                count = count + 1
        count1 = abs(sum(img_[j][0])-sum(img_[zj][img_.shape[1]-1]))
        loss = count*0.5 -count1*0.3
        if(loss>Max):
            Max = loss
            index = j
    lie_index.append(index)
    if(len(lie_index)>=img_.shape[0]-1):
        break
lie_index.append(end_hang_index)
print("列排序:"+str(lie_index))
#******图片列拼接  输出最终拼接图片  基于拼接好的ans_hang_img图片矩阵
ans_img = []
ans_img = ans_hang_img[lie_index[0]]
for i in range(0,len(lie_index)):
    if(i==0):
        continue
    ans_img = np.vstack((ans_img, ans_hang_img[lie_index[i]]))  # 
im = Image.fromarray(ans_img)  # to Image
im.save('result3.png')



结果:

  1. 字宽和行宽

以下为中文字宽和行宽的个数统计,可以看出空白行宽的大小应为27、26、28;字宽的大小应为40、39、38。

空白行宽度统计:Counter({27: 177, 26: 80, 28: 74, 29: 28, 21: 15, 24: 14, 18: 14, 30: 13, 58: 13, 8: 13, 2: 10, 15: 10, 14: 9, 95: 9, 5: 9, 12: 8, 7: 8, 37: 8, 1: 7, 6: 7, 20: 6, 36: 5, 70: 5, 57: 5, 31: 4, 25: 4, 96: 4, 38: 3, 82: 3, 13: 3, 3: 3, 83: 3, 9: 3, 94: 2, 99: 2, 39: 2, 97: 2, 92: 1, 4: 1, 23: 1, 56: 1, 17: 1, 98: 1, 68: 1, 19: 1, 59: 1, 40: 1, 44: 1, 93: 1, 16: 1, 64: 1, 71: 1, 55: 1, 84: 1})

字宽统计:Counter({40: 137, 39: 134, 38: 61, 37: 33, 36: 19, 21: 17, 27: 16, 3: 15, 15: 15, 5: 14, 11: 14, 17: 14, 34: 13, 33: 12, 24: 11, 18: 10, 4: 10, 41: 9, 35: 8, 23: 5, 14: 4, 0: 4, 19: 4, 16: 3, 12: 3, 20: 3, 10: 3, 26: 2, 25: 2, 22: 2, 9: 2, 2: 1, 8: 1, 28: 1, 6: 1, 32: 1})

以下为英文字宽和行宽的个数统计,可以看出空白行宽的大小应为25;字宽的大小应为36、24、37。

空白行宽度统计:Counter({25: 93, 26: 61, 38: 59, 24: 50, 37: 43, 17: 34, 4: 32, 27: 28, 7: 26, 8: 24, 30: 18, 11: 17, 18: 16, 29: 15, 12: 14, 3: 12, 31: 11, 19: 10, 14: 10, 9: 9, 47: 8, 13: 8, 28: 8, 60: 6, 10: 6, 90: 5, 20: 5, 51: 5, 61: 5, 6: 5, 40: 5, 36: 4, 103: 4, 49: 4, 91: 3, 2: 3, 39: 3, 5: 3, 64: 3, 16: 3, 15: 2, 50: 2, 23: 2, 52: 2, 114: 1, 105: 1, 101: 1, 48: 1, 56: 1, 89: 1, 32: 1, 33: 1, 92: 1, 102: 1, 86: 1, 104: 1})

字宽统计:Counter({36: 98, 24: 96, 37: 89, 35: 46, 23: 38, 34: 37, 1: 31, 5: 28, 31: 25, 2: 23, 50: 21, 22: 19, 0: 17, 32: 13, 13: 13, 21: 11, 14: 9, 49: 8, 4: 8, 9: 7, 3: 5, 30: 5, 33: 5, 27: 4, 45: 4, 12: 3, 48: 3, 20: 3, 11: 2, 7: 2, 6: 2, 41: 1, 47: 1, 40: 1, 17: 1, 28: 1, 8: 1, 43: 1, 15: 1, 42: 1})

  1. K-mewns聚类结果:

如下为聚类类别统计:

2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv

如下为每张图片所属的类别序号:

[ 4,  3,  2,  5,  6,  9,  1,  4,  0,  0,  9,  2,  5,  8,  5,  7,  8,

        7,  3,  1,  1,  8,  2,  3,  0,  0,  3,  7,  2,  9,  3,  5,  4,  7,

       10,  0,  1,  9,  0,  5,  6,  3, 10, 10,  9,  4,  0, 10,  9,  2,  3,

        5,  1,  4,  2,  9,  4,  2, 10,  9,  7,  1,  3,  1,  9,  2,  8,  1,

        4,  1,  4,  7,  1,  5,  0,  9,  3, 10,  1,  1,  7,  0,  5,  7, 10,

        7,  3,  3,  0,  6, 10,  2,  9,  4, 10,  2,  1, 10,  9,  1,  3,  6,

        6,  0,  9,  0,  8,  5,  6,  8,  8,  9, 10,  6,  6,  5,  1,  6,  2,

        6,  3, 10,  0,  6, 10,  8,  4, 10,  5,  2,  0,  1,  7,  7,  5,  5,

       10,  4,  4,  8,  6,  2,  3,  2, 10,  8,  6,  3,  0, 10,  8,  6,  7,

        4,  6,  6,  7,  8,  4,  5,  5,  0,  1,  1, 10,  7,  4,  0,  3,  5,

        7,  9,  9,  8,  4,  4,  5,  1,  2,  3,  9,  8,  8, 10,  8,  6,  2,

        8,  2,  0,  2,  3,  2,  0,  6,  3,  4,  8,  7,  5,  7,  9,  7,  5,

        8,  7,  9,  6,  4]

  1. 行列排列顺序

行内排序:

[7, 208, 138, 158, 126, 68, 175, 45, 174, 0, 137, 53, 56, 93, 153, 70, 166, 32, 196]

[14, 128, 3, 159, 82, 199, 135, 12, 73, 160, 203, 169, 134, 39, 31, 51, 107, 115, 176]

[29, 64, 111, 201, 5, 92, 180, 48, 37, 75, 55, 44, 206, 10, 104, 98, 172, 171, 59]

[38, 24, 35, 81, 189, 122, 103, 130, 193, 88, 167, 25, 8, 105, 161, 9, 46, 148, 74]

[49, 54, 65, 143, 186, 2, 57, 192, 178, 118, 190, 95, 11, 22, 129, 28, 91, 188, 141]

[61, 19, 78, 67, 69, 99, 162, 96, 131, 79, 63, 116, 163, 72, 6, 177, 20, 52, 36]

[71, 156, 80, 33, 202, 198, 15, 133, 170, 205, 85, 152, 165, 27, 83, 132, 200, 17, 60]

[89, 146, 4, 101, 113, 194, 119, 114, 40, 151, 207, 155, 140, 185, 108, 117, 102, 154, 123]

[94, 34, 84, 183, 90, 47, 121, 42, 124, 144, 77, 112, 149, 97, 136, 164, 127, 58, 43]

[125, 13, 182, 109, 197, 16, 184, 110, 187, 66, 106, 150, 21, 173, 157, 181, 204, 139, 145]

[168, 100, 76, 62, 142, 30, 41, 23, 147, 191, 50, 179, 120, 86, 195, 26, 1, 87, 18]

列排序:

[4, 5, 1, 8, 9, 2, 0, 10, 3, 6, 7]

  1. 图片复原结果

如下图所示(result3.png文件)

2013年数学建模b题纸片拼接代码,python,计算机视觉,opencv文章来源地址https://www.toymoban.com/news/detail-526462.html

到了这里,关于(数学建模)2013年国赛B题-碎纸片复原python代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2020年国赛高教杯数学建模C题中小微企业的信贷决策解题全过程文档及程序

       在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策、企业的交易票据信息和上下游企业的影响力,向实力强、供求关系稳定的企业提供贷款,并可以对信誉高、信贷风险小的企业给予利率优惠。银行首先根据中小微企业的实力、信

    2024年02月12日
    浏览(48)
  • 2019年国赛高教杯数学建模D题空气质量数据的校准解题全过程文档及程序

       空气污染对生态环境和人类健康危害巨大,通过对“两尘四气”(PM2.5、PM10、CO、NO2、SO2、O3)浓度的实时监测可以及时掌握空气质量,对污染源采取相应措施。虽然国家监测控制站点(国控点)对“两尘四气”有监测数据,且较为准确,但因为国控点的布控较少,数据

    2024年02月07日
    浏览(39)
  • 2019年国赛高教杯数学建模C题机场的出租车问题解题全过程文档及程序

       大多数乘客下飞机后要去市区(或周边)的目的地,出租车是主要的交通工具之一。国内多数机场都是将送客(出发)与接客(到达)通道分开的。送客到机场的出租车司机都将会面临两个选择:    (A) 前往到达区排队等待载客返回市区。出租车必须到指定的“蓄车池

    2024年02月11日
    浏览(148)
  • 2018年国赛高教杯数学建模A题高温作业专用服装设计解题全过程文档及程序

       在高温环境下工作时,人们需要穿着专用服装以避免灼伤。专用服装通常由三层织物材料构成,记为I、II、III层,其中I层与外界环境接触,III层与皮肤之间还存在空隙,将此空隙记为IV层。    为设计专用服装,将体内温度控制在37ºC的假人放置在实验室的高温环境中

    2024年02月14日
    浏览(44)
  • 【数学建模】历年数学建模国赛评价类题目汇总

    年份 题目 模型/算法/解题方法 1993B题:足球甲级联赛排名问题 评价与决策 2005A题:长江水质的评价与预测问题 综合评价和预测问题(非常典型和传统的问题) 2005C题:雨量预报方法的评价问题 综合评价问题 2006B题:艾滋病疗法的评价及预测问题 评价和预测(分类、拟合、线性

    2024年02月07日
    浏览(55)
  • 【数学建模】2018年数学建模国赛C题 问题一代码

    本文从购买力、购买时间偏好两个维度分析会员的消费特征。 以会员消费总金额、消费次数、商品购买数量代表会员购买力; 同时按季节和天对会员消费行为进行消费时间偏好分析。 同时对会员及非会员的消费次数和消费金额进行对比分析。 导入包及数据 数据探索与预处

    2024年02月14日
    浏览(42)
  • 数学建模国赛模板

    摘要 摘要是论文内容不加注释和评论的简短陈述,其作用是使读者不阅读论文全文即能获得必要的信息。 Eg: 背景 本文讨论了… 400字左右,约大半个页面,简明扼要。 1.说明是什么问题    2.用什么模型解决的(模型的主要特点、建模方法)   3.用什么软件求解的(计

    2024年02月10日
    浏览(56)
  • 【数学建模】2023数学建模国赛C题完整思路和代码解析

    C题第一问代码和求解结果已完成,第一问数据量有点大,经过编程整理出来了单品销售额的汇总数据、将附件2中的单品编码替换为分类编码,整理出了蔬菜各品类随着时间变化的销售量,并做出了这些疏菜品类的皮尔森相关系数的热力图,代码和数据处理结果下载见文末地

    2024年02月09日
    浏览(44)
  • 数学建模复盘之 --- 2020数学建模国赛C-中小微企业的信贷决策

    该项目为2020年,国赛数学建模,本学长帮助同学完成,共带5队,3个一等奖,2个二等奖,今天带大家进行复盘。 本次复盘非提供给同学的参赛项目,这里只做基础的简单分析,参赛作品不给予提供。 数据一用提供了3个csv文件: 附件1:123家有信贷记录企业的相关数据.xlsx 附

    2023年04月10日
    浏览(60)
  • 数学建模国赛2022C解题分享

    GitHub - KZF-kzf/MathModeling2022C: 数模国赛的所有代码和数据 数模国赛的所有代码和数据. Contribute to KZF-kzf/MathModeling2022C development by creating an account on GitHub. https://github.com/KZF-kzf/MathModeling2022C/tree/main 【更新一波,所有的代码和数据都放在了github上,需要的朋友自取】 ———————

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包