1. 程式人生 > 其它 >MATLAB實現自動水錶讀數

MATLAB實現自動水錶讀數

技術標籤:影象處理matlab機器學習

MATLAB實現自動水錶讀數

1、 本文中的人工智慧應用例項介紹
現在水錶生產企業所生產的水錶,出廠前都需要對其進行檢定,只有達到了要求的檢測精度才可以進入市場。當前應用的水錶校驗系統,大多采用人工操作的方法,需要人工進行抄讀測量結果並進行水錶誤差的計算,這種人工校驗方法,不僅檢定效率低,工作強度大,而且檢定結果極易受人為因素的影響[1]。為了克服人工抄表校驗過程中所帶來的各種弊端,本文設計了一款基於影象處理技術的多指標水錶自動校驗系統,來代替人工完成對水錶資料的讀取和處理工作,進而完成對水錶的校驗,不僅可以節約大量的勞動力還可以提高生產效率,減小人為因素所造成的影響。

2、 所用的AI方法原理或方案設計
圖片處理流程如下圖所示:
在這裡插入圖片描述

(1) 提取指標
由水錶圖片可發現,水錶指標顏色與其他部分顏色區別差異較大,因此選擇了通過RGB三個分量來進行處理,將一定範圍外的畫素置為白色,使得最後剩下來的非白色的部分即為指標。本文中保留R(120-220),G(10-70),B(10-70)的區域,其餘設定為255。
原圖RGB提取後圖片

在通過RGB提取後的圖片,我們可以清楚的看到圖片中只剩下了各個指標不為白色,這將是我們作為後續處理的基礎。
(2) 變為二值影象
由於RGB的彩色影象表示複雜,許多操作難以進行,因為選擇了只有0和1來表示顏色的二值影象,其中0表示黑色,1表示白色。使用的函式為im2bw。

A=im2bw(B) %B為要轉換的RGB真彩色影象,A為所得的二值影象。結果如圖:在這裡插入圖片描述

結果如圖所示,紅色指標變為黑色。
(3) 腐蝕
從上圖中不難發現,進行了RGB提取與二值化後,雖然圖片被直接分為了黑色和白色,但由於拍攝原因,黑白顏色會容易夾雜在一起,因此需要進行腐蝕操作讓指標變得圓滑。使用的函式為imerode函式。
IM2 = imerode(IM,SE)
腐蝕灰度、二進位制或壓縮二進位制影象 IM ,返回腐蝕影象 IM2 。引數 SE 是函式 strel 返回的一個結構元素體或是結構元素體陣列。如果 IM 是邏輯影象,結構元素是平坦的, imerode 執行二進位制膨脹;否則執行灰度腐蝕。如果SE 是一個結構元素體陣列, imerode 接連使用 SE 中的每個結構元素體對輸入影象進行多重腐蝕。

結果如圖:在這裡插入圖片描述

經過腐蝕操作後,可以看到在保留了指標的基本結構下,指標中的白 色斑點被去除了,各個指標真正實現了完全提取。
(4) 霍夫變換
完全提取出指標後,便做好了前期的處理工作,接下來進行核心的處理,進行霍夫變換。這裡先介紹霍夫變換:
Hough變換的方法基本思想可以從檢測影象中的直線這個簡單問題中看到。直線由兩點A=(X1,Y1)和B=(X2,Y2)定義,所下圖1(a)示。通過點A的所有直線由y1=kx1+q表示,k和q是某些值。這意味著同一個方程可以解釋為引數空間k,q的方程。因此通過點A的所須直線可以表示為方程q=-x1k+y1圖1.(b)。類似地通過點B的直線可以表示q=-x2*k+y2。在引數空間k和q中,兩條直線的唯一公共點是在原影象空間中表示連線點A和B的唯一存在的直線。
在這裡插入圖片描述

這意味著影象中的每條直線在引數空k,q中由單獨一個點表示,直線的任何一部分都變換為同一個點。直線檢測的主要思想是確定圖中所在的直線畫素,將通過這些畫素的所在直線變換到引數空間的對應點,在引數空間檢測點(a,b),此點是影象中出現的直線y=ax+b的Hough變換的結果。
影象中所有可能的直線畫素的檢測,可以通過在影象中進行邊緣檢測子得到,所有邊緣幅值超過某個閾值的畫素都可以看作是可能的直線畫素。在最一般的情況下,當我們沒有任何有關影象中的直線資訊,因此,所有方向的直線可能通過任何邊緣畫素。而在現在實現中,這些直線的數目是無限的,然而,為了實際目標,只能有限數目的直線方向。直線的可能方向定義了引數K的一個離散化,因此引數q也被取樣為有限數目的值。所以引數空間不是連續的,而是被表示為矩形單元,稱之為累計陣列(accumulator array) A,它的元素是累計單元(Accumulator cells) A(k,q). 對於每個邊緣元素,確定其引數k和q。這些引數表示了通過此畫素的允許方向的直線。對於每條這樣的直線,直線引數k和q的值用來增加累計單元A(k,q)的值。如果公式y=ax+b所表示的直線出現在影象中,A(a,b)的值會被增加很多次,而次數等於直線y=ax+b作為可能通過某個邊緣畫素的直線被檢測到的數目。
對於任意畫素P,通過它的直線可能是任何的方向k,但是第二個引數q受畫素P影象座標和方向k所約束。因此,存在於影象中的直線會引起影象中適合的累計單元值變大,而通近邊緣畫素的其他直線,它們不對應於影象中存在的直線,對於每個邊緣畫素具有不同的引數k和q,所以對應的累計單元極少被增加。即:影象中存在的直線可以作為累計陣列中的高值累計單元被檢測出業,檢測到的直線引數由累計陣列的座標給出,結果是影象中直線的檢測被為累計空間中的區域性極值的檢測。[2]
這裡介紹霍夫變換應用的三個函式:

  1. [H, theta, rho] = hough (f);%f為輸入的二值影象,H為輸出矩陣,theta為角度,rho為長度。[2]
  2. [r,c]= houghpeaks (H,5);%r,c為輸出矩陣,H為函式一的輸出矩陣,5為尋找的峰值的個數。該函式功能是找到峰值,峰值個數可由自己確定。[3]
  3. lines = houghlines (f, theta,rho, r,c)%f為輸入二值影象,r,c為函式二的輸出矩陣。該函式功能是查詢並連結帶峰值位置並重疊的Hough變換。[3]
    在這裡插入圖片描述在這裡插入圖片描述

從上右圖中可看到三個指標都實現了正確標記。各個點位都被記錄在了變數lines中,包括直線的長度與角度。
(5) 在步驟四中已經將得到的三個角度記錄在了變數lines中,此時即可通過角度與該指標所在的刻度進行運算得出最後總的水錶指數。
3、 結果分析與討論
最後通過霍夫變換,三個函式得出了三個指標的角度,從而計算出了指標的讀數,但若應用於實際生產中會有許多的問題。如第一步通過rgb分量提取指標,這一步驟事實上充滿了不確定性,會被許多因素干擾,如拍攝時的角度,光線,以及水錶表面有汙漬會嚴重影響提取出的指標的質量。以及最後的角度順序與水錶指標的配對問題,這一問題我更傾向於通過影象分割來處理。
以下為MATLAB下的程式碼:

clc;
close all;
clear all;
I=imread('clo5.png');
figure(4),imshow(I)
lot_1=I;
lot_R=I(:,:,1);
lot_G=I(:,:,2);
lot_B=I(:,:,3);
lot_R1=lot_R;
lot_G1=lot_G;
lot_B1=lot_B;
lot_R1((lot_R<=120)|(lot_R>=220)|(lot_G>=70)|(lot_G<=10)|(lot_B>70)|(lot_B<=10))=255;%提取指標
lot_G1(lot_R<=120|lot_R>=220|lot_G>=70|lot_G<=10|lot_B>70|lot_B<=10)=255;
lot_B1(lot_R<=120|lot_R>=220|lot_G>=70|lot_G<=10|lot_B>70|lot_B<=10)=255;
lot_1(:,:,1)=lot_R1;
lot_1(:,:,2)=lot_G1;
lot_1(:,:,3)=lot_B1;
figure(1),imshow(lot_1);
BW = im2bw(lot_1,graythresh(I));   %二值化影象
figure(2),imshow(BW)
se=strel('disk',5); 
BW=imerode(BW,se);   %腐蝕
figure(3),imshow(BW)
BW=~BW   %取反
[H, theta, rho]= hough(BW,'RhoResolution',0.5);      %霍夫變換
peak=houghpeaks(H,3,'threshold',ceil(0.3*max(H(:))));    %尋找峰值
hold on      
lines=houghlines(BW,theta,rho,peak,'FillGap',5,'MinLength',7);    %尋找直線的起始點
figure,imshow(BW,[]),title('Hough Transform Detect Result'),hold on    
for k=1:length(lines)    %標出直線
    	xy=[lines(k).point1;lines(k).point2];    
   		plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','red');
end

參考文獻:
[1]喬麗娟. 基於影象處理技術的多指標水錶自動校驗系統[博士(碩士)學位論文][D]知網
[2]Hough Transform:http://en.wikipedia.org/wiki/Hough_transform
[3].岡薩雷斯.數字影象處理(MATLAB版)[C].北京:電子工業出版社, 2005: 296-301