获取棋盘格与标准模板在扫描仪上不同位置图片
簡 介: 利用滑軌帶動測量模板在掃描儀上滑動,通過識別結果來測試掃描儀沿著橫向和縱向變化的情況。對于V370,它的橫向和縱向的變化極差都在0.05mm之內。
關鍵詞: 掃描儀,V370,方差
Contents測量方案掃描與移動掃描圖片數據處理模板往下移動棋盤格往下移棋盤格對角線平移處理總結處理程序
?
§00 背景介紹
??普通的掃描儀在獲取一般圖片的過程中,由于平移以及光學失真所噪聲的圖片變形都在可以容忍的范圍之內,但基于掃描儀制作的分析儀測試儀器,比如陰影圈測量儀,就需要對于掃描儀可能產生的隨機和系統誤差進行測試。
??利用滑軌帶動標準圖片在掃描儀上不同位置運動,獲取后期的圖片之后進行處理,便可以獲得掃描儀不同位置上的測量失真。
?
§01 測量方案
1.1 掃描與移動
1.1.1 掃描儀
??利用 EPSON Perfection V370 掃描儀來獲取標準測量物在不同位置上的掃描圖片。利用掃描儀自身所帶的掃描程序 通過Python編程進行自動掃描陰影圈模板在不同位置上的圖片 。
▲ 圖1.1 V370掃描過程
??掃描儀 BENQ 5560 由于沒有能夠成功在實驗計算機上安裝對應的驅動程序,所以這次實驗只使用V370完成圖片的社區。
1.1.2 滑軌控制
??用于移動測量物(棋盤格、陰影圈模板)的滑軌使用 蝸桿單軌滑軌 ,利用它移動測量物在掃描儀表面移動。這個蝸桿滑軌利用 無觸點感應行程開關 SN04-N 進行極限控制。具有0.891米的 形成控制。
▲ 圖1.1.2 實驗平臺上的蝸桿滑軌與控制器
??現在利用 基于ESP8266步進電機控制器 驅動滑軌運行。
- 最大行程:0.891米
- 移動步數:18000
▲ 圖 滑軌在移動
1.1.3 固定陰影圈模板與滑軌
??利用杠桿將滑軌與模板進行相連,帶動其在掃描儀上滑動。
▲ 圖 完成一次掃描成像
??滑軌帶動模板移動:
1.2 掃描圖片
1.2.1 掃描參數
- 滑塊移動步數:4200
- 滑塊移動次數:50,對應每次移動步數:84
??蝸桿滑軌移動參數:
- 移動步數:3200
- 移動距離:15.8mm
▲ 圖1.2.1 掃描后的圖像
??從上面掃描圖來看,這種通過反射獲得取的陰影圈圖像由于出現鏡面反射,亮度出現很大的變化。下面是通過噴涂紅色油漆來改善這種情況。留在明天對這種噴涂陰影圈模板進行采集對比。
▲ 圖1.2.2 在金屬陰影圈表面噴涂黃色油漆
1.2.2 掃描程序
from headm import * from tsmodule.tshardware import *epson_title = 'EPSON' save_title = '文件保存設置' process_title = '進程'def epsonScan():tspsendwindowkey(epson_title, "s", alt=1,noreturn=1)time.sleep(.1)if sum(tspgetwindowrect(save_title)) != 0:tspsendwindowkey(save_title, "\r", noreturn=1)while True:time.sleep(1)if(sum(tspgetwindowrect(process_title)) != 0): breaktspbeep(800, 20)while True:time.sleep(1)if(sum(tspgetwindowrect(process_title)) == 0): breaktspbeep(1800, 20)printf('\a')for i in range(100):printf("Scan time:%d"%i)epsonScan()rcccw(40)time.sleep(1)printf('\a')1.2.3 掃描結果
??下面獲得了三個移動物體之后的掃描圖片數據。它們分別是:
- 陰影圈移動圖片:50
- 棋盤格往下移動:80
- 棋盤格對角線移動:100
▲ 圖1.2.4 拍攝的移動的模板圖片
▲ 圖1.2.5 掃描棋盤格
▲ 圖1.2.6 傾斜方向移動
1.2.4 圖片數據存儲
??上面三組掃描圖片,另外加上 掃描標準陰影圈模板 中的掃描圖像,總共四個圖片集合,存儲在:
- CSDN 下載數據 : https://download.csdn.net/download/zhuoqingjoking97298/77568483
- AI Studio 掃描儀性能檢測項目 : https://aistudio.baidu.com/aistudio/projectdetail/3438461
/home/aistudio/work/Scanner/ChessboardModel.zip
?
§02 數據處理
??所有數據處理過程都在 AI Studio掃描儀性能檢測項目 完成數據處理。
2.1 模板往下移動
2.1.1 處理代碼
from headm import * # = import cv2 from tqdm import tqdmmodeldown = '/home/aistudio/work/Scanner/Model-down' chessboarddown = '/home/aistudio/work/Scanner/Chessboard-down' chessboarddiagonal = '/home/aistudio/work/Scanner/Chessboard-diagonal'filedir = modeldownfiledim = sorted([s for s in os.listdir(filedir) if s.find('jpg') > 0])def modelArg(filename):img = cv2.imread(os.path.join(filedir,filename))gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,50, param1=220, param2=30,minRadius=40, maxRadius=60)return img, circles[0]gifpath = '/home/aistudio/GIF' if not os.path.isdir(gifpath):os.makedirs(gifpath) gifdim = os.listdir(gifpath) for f in gifdim:fn = os.path.join(gifpath, f)if os.path.isfile(fn):os.remove(fn)allcircle = [] for id,f in tqdm(enumerate(filedim)):img,circles = modelArg(f)img[where(img<50)]=50if len(circles) > 0:for c in circles:cv2.circle(img, (c[0], c[1]), int(c[-1]), (255, 0, 0), 6)plt.clf()plt.figure(figsize=(12,15))plt.imshow(img)savefile = os.path.join(gifpath, '%03d.jpg'%id)plt.savefig(savefile)allcircle.append(circles)2.1.2 處理結果
▲ 圖 檢測所有的圓環 def circles2ratio(c):cm = mean(c, axis=0)rdim = [0]*4for cc in c:if cc[0] <= cm[0] and cc[1] <= cm[1]:rdim[0] = cc[2]elif cc[0] <= cm[0] and cc[1] > cm[1]:rdim[1] = cc[2]elif cc[0] > cm[0] and cc[1] <= cm[1]:rdim[2] = cc[2]else: rdim[3] = cc[2]return rdim rdim1 = [] rdim2 = [] rdim3 = [] rdim4 = []for c in allcircle:r = circles2ratio(c)rdim1.append(r[0])rdim2.append(r[1])rdim3.append(r[2])rdim4.append(r[3])plt.clf() plt.figure(figsize=(10,6)) plt.plot(rdim1, label='Ratio1') plt.plot(rdim2, label='Ratio2') plt.plot(rdim3, label='Ratio3') plt.plot(rdim4, label='Ratio4') plt.xlabel("n") plt.ylabel("value") plt.grid(True) plt.tight_layout() plt.legend(loc='upper right') plt.savefig('/home/aistudio/stdout.jpg') plt.show()
▲ 圖2.1.2 求取結果分布 print("std(rdim1): {}".format(std(rdim1)),"std(rdim2): {}".format(std(rdim2)),"std(rdim3): {}".format(std(rdim3)),"std(rdim4): {}".format(std(rdim4)))plt.clf() plt.figure(figsize=(10,6)) plt.hist(rdim1) plt.hist(rdim2) plt.hist(rdim3) plt.hist(rdim4)plt.xlabel('Ratio') plt.ylabel('Hist') plt.grid(True) plt.tight_layout() plt.savefig('/home/aistudio/stdout.jpg')
▲ 圖2.1.4 求取結果分布 std(rdim1): 0.4690808057785034 std(rdim2): 0.5530140995979309 std(rdim3): 0.6512018442153931 std(rdim4): 0.6946914792060852
2.2 棋盤格往下移
▲ 圖2.2.1 掃描棋盤格▲ 圖 棋盤格往下移動
??利用所有點的方差的平方根代表等效的圓的直徑。設 (xi,yi),i=1,2,?,N\left( {x_i ,y_i } \right),i = 1,2, \cdots ,N(xi?,yi?),i=1,2,?,N 是所有采集到的的角點的位置。對應測量結果由下面公式給出:r=var(xi)+var(yi)r = \sqrt {{\mathop{\rm var}} \left( {x_i } \right) + {\mathop{\rm var}} \left( {y_i } \right)}r=var(xi?)+var(yi?)?
??下面給出了隨著移動步數而變化的測量結果。
??這是變化結果的分布。
??極差范圍:0.0254mm
std(sqrt(vdim)): 0.034592300653457642.3 棋盤格對角線平移
??傾斜方向的移動反映了掃描儀左右方向與垂直方向發生面積形變的綜合。
▲ 圖A2.3.2 測量結果隨著運行變化情況
▲ 圖2.3.2 面積統計分布 std(sqrt(vdim)): 0.07298741489648819
??測量數據對應的極差:Δ=138.95?138.65150×25.4=0.051mm\Delta = {{138.95 - 138.65} \over {150}} \times 25.4 = 0.051mmΔ=150138.95?138.65?×25.4=0.051mm
?
※ 處理總結 ※
??利用滑軌帶動測量模板在掃描儀上滑動,通過識別結果來測試掃描儀沿著橫向和縱向變化的情況。對于V370,它的橫向和縱向的變化極差都在0.05mm之內。
■ 相關文獻鏈接:
- Epson Perfection V370 Photo圖片掃描自動控制
- 掃描標準陰影圈模板
- 安裝BENQSCANNER 5560驅動與測試掃描
- 蝸桿單軌滑軌
- 無觸點感應行程開關 SN04-N
- 基于ESP8266 WiFi控制的步進升降機械平臺
- 掃描后的棋盤格,用于測試對應的掃描儀的性能。-網絡攻防文檔類資源-CSDN文庫
- AI Studio 掃描儀性能檢測項目
● 相關圖表鏈接:
- 圖1.1 V370掃描過程
- 圖1.1.2 實驗平臺上的蝸桿滑軌與控制器
- 圖 滑軌在移動
- 圖1.1.4 利用杠桿將滑軌與模板進行相連,帶動其在掃描儀上滑動
- 圖 完成一次掃描成像
- 圖 滑軌帶動模板移動
- 圖1.2.1 掃描后的圖像
- 圖1.2.2 在金屬陰影圈表面噴涂黃色油漆
- 圖1.2.4 拍攝的移動的模板圖片
- 圖1.2.5 掃描棋盤格
- 圖1.2.6 傾斜方向移動
- 圖 檢測所有的圓環
- 圖2.1.2 求取結果分布
- 圖2.1.4 求取結果分布
- 圖 棋盤格往下移動
- 圖2.2.2 格點標準方差變化
- 圖2.2.3 格點標準方差變化統計
- 圖 圖像處理結果
- 圖A2.3.2 測量結果隨著運行變化情況
- 圖2.3.2 面積統計分布
處理程序
處理陰影圈程序
#!/usr/local/bin/python # -*- coding: gbk -*- #============================================================ # MODEL.PY -- by Dr. ZhuoQing 2022-01-23 # # Note: #============================================================from headm import * # = import cv2 from tqdm import tqdmmodeldown = '/home/aistudio/work/Scanner/Model-down' chessboarddown = '/home/aistudio/work/Scanner/Chessboard-down' chessboarddiagonal = '/home/aistudio/work/Scanner/Chessboard-diagonal'#------------------------------------------------------------ filedir = modeldownfiledim = sorted([s for s in os.listdir(filedir) if s.find('jpg') > 0]) #printt(filedim)#------------------------------------------------------------ def modelArg(filename):img = cv2.imread(os.path.join(filedir,filename))gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,50, param1=220, param2=30,minRadius=40, maxRadius=60)return img, circles[0]#------------------------------------------------------------gifpath = '/home/aistudio/GIF' if not os.path.isdir(gifpath):os.makedirs(gifpath) gifdim = os.listdir(gifpath) for f in gifdim:fn = os.path.join(gifpath, f)if os.path.isfile(fn):os.remove(fn)#------------------------------------------------------------ allcircle = [] for id,f in tqdm(enumerate(filedim)):img,circles = modelArg(f)img[where(img<50)]=50if len(circles) > 0:for c in circles:cv2.circle(img, (c[0], c[1]), int(c[-1]), (255, 0, 0), 6)# printt(circles)plt.clf()plt.figure(figsize=(12,15))plt.imshow(img) # plt.savefig('/home/aistudio/stdout.jpg')savefile = os.path.join(gifpath, '%03d.jpg'%id)plt.savefig(savefile)allcircle.append(circles)# break#------------------------------------------------------------ #printt(allcircle)def circles2ratio(c):cm = mean(c, axis=0) # printt(cm:)rdim = [0]*4for cc in c:if cc[0] <= cm[0] and cc[1] <= cm[1]:rdim[0] = cc[2]elif cc[0] <= cm[0] and cc[1] > cm[1]:rdim[1] = cc[2]elif cc[0] > cm[0] and cc[1] <= cm[1]:rdim[2] = cc[2]else: rdim[3] = cc[2]return rdim#------------------------------------------------------------ rdim1 = [] rdim2 = [] rdim3 = [] rdim4 = []for c in allcircle:r = circles2ratio(c) # printt(r:)rdim1.append(r[0])rdim2.append(r[1])rdim3.append(r[2])rdim4.append(r[3])plt.clf() plt.figure(figsize=(10,6)) plt.plot(rdim1, label='Ratio1') plt.plot(rdim2, label='Ratio2') plt.plot(rdim3, label='Ratio3') plt.plot(rdim4, label='Ratio4') plt.xlabel("n") plt.ylabel("value") plt.grid(True) plt.tight_layout() plt.legend(loc='upper right') plt.savefig('/home/aistudio/stdout.jpg') plt.show()#------------------------------------------------------------ printt(std(rdim1):,std(rdim2):,std(rdim3):,std(rdim4):)plt.clf() plt.figure(figsize=(10,6)) plt.hist(rdim1) plt.hist(rdim2) plt.hist(rdim3) plt.hist(rdim4)plt.xlabel('Ratio') plt.ylabel('Hist') plt.grid(True) plt.tight_layout() plt.savefig('/home/aistudio/stdout.jpg')#------------------------------------------------------------ # END OF FILE : MODEL.PY #============================================================處理棋盤格
#!/usr/local/bin/python # -*- coding: gbk -*- #============================================================ # CHESSB.PY -- by Dr. ZhuoQing 2022-01-24 # # Note: #============================================================from headm import * # = import cv2 from tqdm import tqdmmodeldown = '/home/aistudio/work/Scanner/Model-down' chessboarddown = '/home/aistudio/work/Scanner/Chessboard-down' chessboarddiagonal = '/home/aistudio/work/Scanner/Chessboard-diagonal'#------------------------------------------------------------ filedir = chessboarddiagonalfiledim = sorted([s for s in os.listdir(filedir) if s.find('jpg') > 0]) #printt(filedim)CORNER_NUM = (11,8)def img2Corners(f):fn = os.path.join(filedir, f)img = cv2.imread(fn)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)corners = cv2.findChessboardCorners(gray, CORNER_NUM, None)c = corners[1].flatten().reshape(-1,2)img[where(img < 50)] = 50for cc in c:cv2.circle(img, tuple(cc.astype(int32)), 4, (255,0,0), 3)return img, mean(c, axis=0), sum(var(c,axis=0))#------------------------------------------------------------gifpath = '/home/aistudio/GIF' if not os.path.isdir(gifpath):os.makedirs(gifpath) gifdim = os.listdir(gifpath) for f in gifdim:fn = os.path.join(gifpath, f)if os.path.isfile(fn):os.remove(fn)centerall = [] vdim = [] for id,f in tqdm(enumerate(filedim)):img,c,v=img2Corners(f)centerall.append(c)vdim.append(v)plt.clf()plt.figure(figsize=(10,15))plt.imshow(img)savefile = os.path.join(gifpath, '%03d.jpg'%id)plt.savefig(savefile)#------------------------------------------------------------ ''' xdim = [] ydim = [] for c in centerall:xdim.append(c[0])ydim.append(c[1])plt.clf() plt.figure(figsize=(10,6)) plt.plot(xdim, ydim) plt.xlabel("n") plt.ylabel("value") plt.grid(True) plt.tight_layout() plt.savefig('/home/aistudio/stdout.jpg') plt.show()''' #------------------------------------------------------------printt(std(sqrt(vdim)):)plt.clf() plt.figure(figsize=(10,6)) #plt.hist(sqrt(vdim)) plt.plot(sqrt(vdim)) plt.xlabel("n") plt.ylabel("R") plt.grid(True) plt.tight_layout() plt.savefig('/home/aistudio/stdout.jpg') plt.show()#------------------------------------------------------------ # END OF FILE : CHESSB.PY #============================================================總結
以上是生活随笔為你收集整理的获取棋盘格与标准模板在扫描仪上不同位置图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑客X档案PDF完整版(06年1月-12
- 下一篇: 数字电视加密技术工作原理(EMM ECM