大神帶你玩轉matlab圖像處理(6)——Hough變換

2021-02-20 matlab愛好者

    近段時間過冷水開始接觸一點點圖像處理的知識三維空間分布函數繪製實例推文就有關於讀取圖像上的數據程序處理。所以說有些知識說不定你那天就能夠使用到,秉持著「技多不壓身」的原則,本期跟隨過冷水了解一點點圖像處理方面的知識吧!之前公眾號作者:小豬豬有連載大神帶你玩轉matlab圖像處理推文。關於圖像處理的基礎知識過冷水就不再重複講解了,在其基礎上繼續深入學習數字圖像的轉變。
    為了能夠有效的快速對圖像進行處理,需要在圖像空間的圖像以某種形式轉換到另一空間,在過冷水的工作中就存在倒易空間和實空間的概念。各空間概念的提出必然有其便捷性。利用空間的特點性質進行圖像加工,就是圖像轉換,比較常見的圖像轉換方式有:算術計算、幾何變換、Hough變換、傅立葉變換、離散變化,有關案例可以看大神帶你玩轉matlab圖像處理 (一)。過冷水重點講講Hough變換。

Hough是基於特徵值提取技術的圖像變換方案。Hough運用兩個坐標空間的之間的變換將在一個空間中具有相同形狀的曲線或直線映射到另一個坐標空間的一個點上形成峰值,從而把檢測任意形狀的問題轉換為統計峰值問題。

基本原理

Hough變換是利用表決原理的參數軌跡技術,說到參數估計,大家能夠想到過冷水做的有關概率統計的推文不?——統計分布講解。基本原理在於利用圖像空間和Hough參數空間點與線的對偶性,把圖像空間中檢測問題轉換為參數空間。通過在參數空間裡進行簡單的累加統計,然後在Hough參數空間尋找累加器峰值的方法找檢測直線。Hough變換的實質是將圖像空間內具有一定關係的像元進行聚類,尋找能把這些像元用某一解析形勢聯繫起來的參數空間累計對應點。在參數空間不超過二維的情況下,這種變換效果理想。將原始圖像空間的給定的曲線表達形式變為參數空間的一個點,這樣就把原始圖像中給定曲線的檢測問題轉化為尋找參數空間的峰值問題,也就是把檢測整體特性轉化為檢測局部特性,例如直線、橢圓、圓、弧線等。

簡而言之,Hough變換思想是:在原始圖像坐標系下的一個點對應了參數坐標系中的一條直線同樣參數坐標系的一條直線對應原始坐標系下的一個點,然後,坐標系下呈現直線的所有點,它們的斜率和截距是相同的,所以它們在參數坐標系下對應於同一個點。這樣在原始坐標系下的各個點的投影到多數坐標系下之後,看參數坐標系下沒有聚集點,這樣的聚集點就對應了原始坐標系下的直線。
     在圖像處理中,從圖像中識別幾何形狀的基本方法之一是Hough變換,它有很多改進算法。最基本的Hough變換是從黑白圖像中檢測直線。廣義的Hough變換已經不僅僅局限於提取直線,二值任意可以用表達式表達的曲線都可以提取,例如圓、橢圓、正弦餘弦曲線等。曲線越是複雜.所需參數越多,運算的時間也就越多。Hough 變換的精髓在於投票算法,將圖像空間轉換到參數空間進行求解。假如已知黑白圖像上畫了一 條直線,要求出這條 直線所在的位置。直線的方程用y=kx+b來表示,其中k和b是參數,分別是斜率和截距,過某一點(x0,y0)的所有直線的參數都會滿足方程y0=kx0+b,即點(x0,y0)確定了一組直線。方程y0=kx0+b在參數k-b平面上是一條直線,這樣,圖像x-y平面上的一個像素點就對應到參數k-b平面上的一條直線。Hough變換的基本思想就是把圖像平面上的點對應到參數平面上的線。在實際應用中,y=kx+b形式的直線方程沒有辦法表示x=c形式的直線。

Hough進行邊緣檢測

clear f=imread('11.png');  %讀入彩色圖像,注意不能使用灰度圖像o=f;                %保留彩色原圖f=rgb2gray(f);          %將彩色圖像轉換為灰度圖像,[檢查下看能否運行,給的代碼裡沒有這個程序。沒有運行結果]f=im2double(f);figure();subplot(231);imshow(o);title('原圖');[m,n]=size(f);          %得到圖像矩陣行數m,列數nfor i=3:m-2    for j=3:n-2         %處理領域較大,所以從圖像(3,3)開始,在(m-2,n-2)結束        %LoG算子 l(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)...-f(i,j+2)-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)-f(i+2,j);    endendsubplot(232);imshow(l);title('LoG算子提取圖像邊緣');
%均值化濾波處理[m,n]=size(l);for i=2:m-1 for j=2:n-1 %LoG算子提取邊緣後,對結果進行均值濾波以去除噪聲,為下一步hough變換提取直線作準備 y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l(i+1,j-1)+l(i+1,j)+l(i+1,j+1); y(i,j)=y(i,j)/9; endendsubplot(233);imshow(y);title('均值濾波器處理後')
%二值化處理q=im2uint8(y);[m,n]=size(q);for i=1:m for j=1:n if q(i,j)>80; %設置二值化的閾值為80 q(i,j)=255; %對圖像進行二值化處理,使圖像邊緣更加突出清晰 else q(i,j)=0; end endendsubplot(234);imshow(q);title('二值化處理後');
%Hough變換檢測直線,使用(a,p)參數空間,a∈[0,180],p∈[0,2d])a=180; %角度的值為0到180度d=round(sqrt(m^2+n^2)); %圖像對角線長度為p的最大值s=zeros(a,2*d); %存儲每個(a,p)個數z=cell(a,2*d); %用元胞存儲每個被檢測的點的坐標for i=1:m for j=1:n %遍歷圖像每個點 if(q(i,j)==255) %只檢測圖像邊緣的白點,其餘點不檢測 for k=1:a %對每個點從1到180度遍歷,取得經過該點的所有直線的p值 p = round(i*cos(pi*k/180)+j*sin(pi*k/180)); %若p大於0,則將點存儲在(d,2d)空間 if(p > 0) s(k,d+p)=s(k,d+p)+1; %(a,p)相應的累加器單元加1 z{k,d+p}=[z{k,d+p},[i,j]']; %存儲點坐標 else ap=abs(p)+1; %若p小於0,則將點存儲在(0,d)空間 s(k,ap)=s(k,ap)+1; %(a,p)相應的累加器單元加一 z{k,ap}=[z{k,ap},[i,j]'];%存儲點坐標 end end end endendfor i=1:a for j=1:d*2 %檢查每個累加器單元中存儲數量 if(s(i,j) >35) %將提取直線的閾值設為35 lp=z{i,j}; %提取對應點坐標 %對滿足閾值條件的累加器單元中(a,p)對應的所有點進行操作 for k=1:s(i,j) o(lp(1,k),lp(2,k),1)=255; %每個點R分量=255,G分量=0,B分量=0 o(lp(1,k),lp(2,k),2)=0; o(lp(1,k),lp(2,k),3)=0; %為滿足閾值要求的直線上的點賦紅色 end end endendsubplot(235)imshow(o);title('hough變換提取邊界直線');

    該代碼案例還包含了其它邊緣檢測的手段,本文沒有提及 方式可以查看往期大神帶你玩轉matlab圖像處理推文。本期過冷水就重點講講Hough變換,對圖像變換其它問題感興趣的可以留言共同探討,往期回顧>>>>>>

統計分布講解

三維空間分布函數繪製實例

大神帶你玩轉matlab圖像處理 (一)

 一文帶你輕鬆搞定matlab各種數據讀寫

過冷水帶您走進matlab數據轉換新世界

十萬個matlab編程問題徵集,歡迎來問

MATLAB編程愛好者Q群正式升級為2000人群,歡迎加入!

matlab愛好者公眾號中回復「QQ」,加入公眾號專屬Q群(非免費),與更多matlab愛好者一起交流回復原創」,加入原創代碼共享Q群,小編原創matlab代碼任性領!

如需轉載,請在公眾號中回復「轉載」獲取授權,未經授權擅自搬運抄襲的,必將追究其責任!

相關焦點

  • 大神帶你玩轉matlab圖像處理(五)
    >第六章:圖片壓縮6.1 JEPG圖片壓縮imwrite語法規則imwrite(A,B,』quality』,ratio)A:原圖像,B:結果圖,ratio:壓縮比率A:原圖像,B:結果圖將真彩色圖像B轉換為灰度圖像A。
  • 基於hough變換的直線檢測
    你有沒有那一刻,改程序改到懷疑人生,就在前天,短短十幾行代碼,改了一天也沒改對,最後讓外行的人看出了6處錯誤,那一刻我真的是懷疑人生了,我都再也不想碰代碼了,跟那位兄弟幫了倒忙 ,在這裡真的給他說對不起!
  • 大神帶你玩轉matlab圖像處理 (一)
    s=what;p=s.path;I=imread([p,'\圖像素材\','lenaRGB.bmp']);I1=flipud(I);subplot(1,2,1);imshow(I);title('原圖');subplot(1,2,2);imshow(I1);title('垂直鏡像');第二章 圖像正交變換2.1 離散餘弦變換
  • matlab處理圖像代碼
    %例2:直方圖的顯示imshow('c:\lilizong\boat.bmp');title('原圖像')%顯示原圖像A=imread('e:\matlabwork\tuxiang\Girl.bmp','bmp');figure;imhist(A),title('對應直方圖')在圖像處理中,點運算是簡單而又重要的一種技術,其中最常用的一種應用就是直方圖的均衡化
  • 【Python3+OpenCV】實現圖像處理—灰度變換篇
    本文將介紹如何在Python3中使用OpenCV實現對圖像處理的灰度變換:灰度化處理,二值化處理,伽馬變換,對數變換,反向變換灰度圖像的對數變換一般表示如公式所示:DB=C*log(1+ DA)其中c為尺度比較常數,DA為原始圖像灰度值,DB為變換後的目標灰度值。如下圖所示,它表示對數曲線下的灰度值變化情況。
  • 基於MATLAB的答題卡識別系統
    1 答題卡讀取2 答題卡傾角檢測3 答題卡位置校正4 答題卡二值化5 答題卡答案識別6 作品展示往期精彩閱讀1 答題卡讀取現有答題卡掃描圖像,如下圖所示。p_name = "答題卡.jpg";A=imread(p_name);2 答題卡傾角檢測考慮有些答題卡有一定的旋轉角度,因此需要利用hough變換原理進行直線檢測,請參考前期文章基於hough變換的直線檢測。
  • MATLAB中圖像處理的一些簡單函數
    是其對應的顏色矩陣,若進行圖像處理後不知道圖像數據的值域可以用[]代替map。 MATLAB圖像處理工具箱中提供的imadjust函數,可以實現上述的線性變換對比度增強。Imadjust函數的語法格式為: J = imadjust(I,[low_in high_in],[low_out high_out]) J = imadjust(I,[low_in high_in],[low_out high_out])返回圖像I經過直方圖調整後的圖像J,[low_in high_in]為原圖像中要變換的灰度範圍,[low_out high_out]指定了變換後的灰度範圍
  • 什麼是傅立葉變換,如何用MATLAB實現?
    美賽考題分為6種:MCM:A題、B題、C題ICM:D題、E題、F題獎項分為:Outstanding Winner(美賽特等獎)Finalist(美賽特等獎提名)Meritorious Winner(美賽一等獎)Honorable Mention(
  • 想通過視頻自學MATLAB的同學戳這裡!
    圖像處理實例詳解視頻第2章:MATLAB基礎MATLAB圖像處理實例詳解視頻第3章:MATLAB圖像處理基礎MATLAB圖像處理實例詳解視頻第4章:數字圖像的運算MATLAB圖像處理實例詳解視頻第5章:圖像增強技術MATLAB圖像處理實例詳解視頻第6章:圖像復原技術MATLAB圖像處理實例詳解視頻第7章:圖像分割技術
  • 一文了解Matlab如何製作動態圖像
    首先,以之前介紹過的心形圖為例,來說明在matlab中如何將繪圖過程保存為gif動態圖像。1.gif文件,在matlab可以使用imwrite將圖像保存為gif,但需要將圖像數據保存為索引圖像。Matlab創建動畫線條我們在繪製動態圖像的目的一般是為了展示圖像的繪製過程,或者是為了在串行獲取數據時,實時展示圖像。為了實現實時繪圖的動畫,我們需要藉助於matlab中的animatedline函數(注意:這是matlab在2014a版本之後才才更新的一個函數,2014a包括2014a之前版本的matlab都不能實現這個功能)。
  • Matlab 圖像處理相關函數命令
    imresize  改變圖像大小語法:B=imresize(A,m,method)imrotate  旋轉圖像語法:B=imrotate(A,angle,method) \ B=imrotate(A,angle,method,'crop') 三、像素和統計處理函數corr2
  • Matlab強大的數組處理功能如何解決圖像處理解析方案
    本文引用地址:http://www.eepw.com.cn/article/308611.htm本文示例均在Matlab R2008a和VC 6.0平臺下完成,且通過調試能夠正常運行。1 Excel文件讀取方法VC平臺下的Excel文件讀取方式複雜難懂,但如果使用Matlab與VC的混合編程方式編寫將更加簡便,而且擁有較強的可擴展性。
  • 快速傅立葉變換FFT在MATLAB中的實現
    首先,為什麼要進行傅立葉變換?將時域的信號變換到頻域的正弦信號,正弦比原信號更簡單,且正弦函數很早就被充分地研究,處理正弦信號比處理原信號更簡單。正弦信號的頻率保持性:輸入為正弦信號,輸出仍是正弦信號,幅度和相位可能發生變化,但頻率與原信號保持一致,只有正弦信號才擁有這樣的性質。
  • 在MATLAB中如何實現快速傅立葉變換
    將時域的信號變換到頻域的正弦信號,正弦比原信號更簡單,且正弦函數很早就被充分地研究,處理正弦信號比處理原信號更簡單。正弦信號的頻率保持性:輸入為正弦信號,輸出仍是正弦信號,幅度和相位可能發生變化,但頻率與原信號保持一致,只有正弦信號才擁有這樣的性質。
  • MATLAB實驗——FFT變換
    實驗基本原理與設計1 應用傅立葉變換進行圖像處理傅立葉變換是線性系統分析的一個有力工具,它能夠定量地分析諸如數位化系統、採樣點、電子放大器、卷積濾波器、噪音和顯示點等的作用。通過實驗培養這項技能,將有助於解決大多數圖像處理問題。對任何想在工作中有效應用數字圖像處理技術的人來說,把時間用在學習和掌握博裡葉變換上是很有必要的。
  • Matlab 圖像處理相關函數命令大全
    imresize  改變圖像大小語法:B=imresize(A,m,method)imrotate  旋轉圖像語法:B=imrotate(A,angle,method) \ B=imrotate(A,angle,method,'crop') 三、像素和統計處理函數corr2
  • 這6個命令助你玩轉matlab自定義函數
    函數對於matlab的重要性這裡就不在贅述了(你了解matlab
  • 基於COM的Matlab參數處理與圖像嵌入在VC中的實現
    本文示例均在Matlab R2008a和VC 6.0平臺下完成,且通過調試能夠正常運行。1 Excel文件讀取方法 VC平臺下的Excel文件讀取方式複雜難懂,但如果使用Matlab與VC的混合編程方式編寫將更加簡便,而且擁有較強的可擴展性。下面代碼詳細講解了該過程。
  • OpenCV系列之霍夫線變換 | 三十二
    現在,讓我們看一下霍夫變換如何處理線條。任何一條線都可以用(ρ,θ)這兩個術語表示。因此,首先創建2D數組或累加器(以保存兩個參數的值),並將其初始設置為0。讓行表示ρ,列表示θ。陣列的大小取決於所需的精度。假設您希望角度的精度為1度,則需要180列。對於ρ,最大距離可能是圖像的對角線長度。因此,以一個像素精度為準,行數可以是圖像的對角線長度。
  • 圖像處理中的數學原理詳解(Part8)——傅立葉變換的來龍去脈
    當然,在閱讀這篇文章之前,請務必保證你已經掌握了傅立葉級數的所有內容,可以參看本文引用地址:http://www.eepw.com.cn/article/201703/345738.htm  圖像處理中的數學原理詳解(Part4) ——傅立葉級數的概念1  http://www.eepw.com.cn/article/201703/344947.htm