SUSAN運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過Canny。不過思想還是有點意思的。 主要思想就是:首先做一個和原映像等大的靶心圖表像。然後用一個圓形的模板,用模板去遍曆原映像每個像素,把模板內的每個像素都和模板中心像素比較,如果灰階小於一個閾值,那麼就對靶心圖表像當前和原映像相同位置的像素加一,直到結束。靶心圖表像中在原映像是角點的位置就會取局部極小,所以做一個反向的相減。img=max(img)-img,if
我主要參考了這裡,不過他推導的係數我感覺有問題,用他的公式直接套用放大的映像會有網格,也許是我理解的有偏差。 所以我自己重新推導了這四個係數 用這個就沒問題了。他的那些代碼還是很有參考價值的。 程式碼:main.mclear all;close all;clc;w=2; %放大或縮小的寬度h=2; %放大或縮小的高度img=imread('lena.jpg');%imshow(img);[m
#include <iostream>using namespace std;int main(int argc, char* argv[]){ float a[8]={1,2,3,4,5,6,7,8}; float b[8]={1,2,3,4,5,6,7,8}; float c[8]; //兩個數組相乘的結果 __asm { mov ebx,0; mov ecx,2; //
opencv這個映像庫兩年前就會用了,本科畢業設計就是用的他,不過其中有很多函數直到現在我也沒怎麼用過。關於這個庫的學習,我自己的目標是只需要學會怎樣調用庫函數完成目標就可以了,至於原理性的東西我就不去深究了,原理的東西我會在matlab中實現的。平台是ubuntu+opencv2,具體版本我忘了。不過2之後的應該都可以。第一個先練手的程式,我盡量用C++版的:#include "cv.h"#include "highgui.h"#include <iostream>using
所有的控制項的建立基本都是同一套道路;第一步:.h中建立一個CSliderCtrl 類的對象 ; CSliderCtrl m_ctrlSlider;第二步:.cpp中的void CMyDlg::DoDataExchange(CDataExchange* pDX)函數進行初始化控制項;//初始化控制項 void CMyDlg::DoDataExchange(CDataExchange*
立體感知對應點匹配基本分為兩種:一是低層的基於像素級的匹配,二是高層的基於特徵級的匹配。這裡介紹的是底層的像素級匹配。用網路攝影機平行移動擷取兩張圖片,其實就是雙目感知到的兩張圖片。原理是在一定的視窗中,兩張圖片具有相同的水平視差,而對比這兩個局部視窗中的像素相似性就能計算出當前像素的深度。先看下效果吧: left.img right.img
《數位影像處理》書上說這7個矩是旋轉、縮放、平移不變的,因此用這7個矩就可以代表一個映像了。我只實驗了縮放的,這幾個數幾乎是不變的,也許做映像檢索的時候可以用到。代碼:main.mclear all;close all;clc;img=imread('lena.jpg');fai1=two_dim_moment(img);img1=imresize(img,[100 100]);fai2=two_dim_moment(img1);img2=imresize(img,[300
主要是用來平滑映像的,克服了高斯模糊的缺陷,各向異性擴散在平滑映像時是保留映像邊緣的(和雙邊濾波很像)。通常我們有將映像看作矩陣的,看作圖的,看作隨機過程的,記得過去還有看作力場的。這次新鮮,將映像看作熱量場了。每個像素看作熱流,根據當前像素和周圍像素的關係,來確定是否要向周圍擴散。比如某個鄰域像素和當前像素差別較大,則代表這個鄰域像素很可能是個邊界,那麼當前像素就不向這個方向擴散了,這個邊界也就得到保留了。先看下效果吧:具體的推導公式都是熱學上的,自己也不太熟悉,感興趣的可以去看原論文,引用量
雙邊濾波模板主要有兩個模板產生,第一個是高斯模板,第二個是以灰階級的差值作為函數係數產生的模板。然後這兩個模板點乘就得到了最終的雙邊濾波模板。 第一個模板是通用範本,所以只需要產生一次。第二個模板需要對每個像素都計算一次,所以需要放到迴圈的裡面來產生,這很像表面模糊啊。哦,表面模糊就是用了一個截尾濾波器。 這裡的公式我參考了這裡,不過她給的第二個好像不是截尾均值濾波器,而是以灰階差值為自變數的高斯濾波器。截尾均值濾波器這裡有一些理論和實現,代碼如下:clear all;close
K最鄰近密度估計技術是一種分類方法,不是聚類方法。不是最優方法,實踐中比較流行。通俗但不一定易懂的規則是:1.計算待分類資料和不同類中每一個資料的距離(歐氏或馬氏)。2.選出最小的前K資料個距離,這裡用到選擇排序法。3.對比這前K個距離,找出K個資料中包含最多的是那個類的資料,即為待分類資料所在的類。不通俗但嚴謹的規則是:給定一個位置特徵向量x和一種距離測量方法,於是有:1.在N個訓練向量外,不考慮類的標籤來確定k鄰近。在兩類的情況下,k選為奇數,一般不是類M的倍數。2.在K個樣本之外,確定屬於
這個YCbCr是從YUV派生出來的,比較適合處理數位影像,JPEG壓縮就是在這個彩色空間中處理的。變換公式。clear all;close all;clc;img=imread('lena_color.jpg');%img=mat2gray(img); %任意區間映射到[0,1];[m n
我不太清楚這個凸包在影像處理中到底會怎樣的運用,因為這個好像更多的是計算幾何或是圖形學裡面的東西。不過作為一個演算法,我感覺還是有必要研究一下的。我主要的參考資料是《演算法導論》的33.3和這個部落格。 代碼在這裡,我唯寫了主要過程,過分細節的判斷就省略了。這裡是逆時針尋找:main.mclear all;close all;clc;img=ones(256,256);imshow(img);[x y]=ginput();x=round(x);y=round(y);n=length(x);
把映像中每一個像素當成有品質的恒星,像素的灰階值就相當於恒星的品質,運用萬有引力定律求得每個像素受到其他像素的“力”,獲得力場映像。 公式就是中學的萬有引力公式,不過這裡是向量場,所以每一個像素受到的力不是簡單的疊加,是向量求和。 好像有用這個力場變換識別耳朵的。 這裡也是求模板大小的局部力場,全域力場我運行了1天,結果不太理想。 相關代碼:main.mclear all;close all;clc;r=3;img=imread('lena.jpg');img=double(img)
過去也寫過透視變換,當時演算法真是弱爆了,我竟然會通過兩次變換。不過那引用的三篇文章都是非常好的文章,直到今天我才看明白。所謂的傾斜校正,一定要有標定點,將一個傾斜的矩形變為不傾斜的。因此可以從原四邊形四個點和新矩形四個點得到一個變換矩陣,根據這個矩陣再作用到全域映像就可以了。詳細原理在這裡,MIT的,我也不會比他介紹的更好了,還是看原版的好。 我這裡的代碼完全就是按照MIT那篇文章的原理實現的,不過因為Matlab細節的原因,我把公式中x和y位置互換了:clear all;close
CString m_strOwner,m_strCompany;void CregDlg::OnBnClickedQuery(){// TODO: 在此添加控制項通知處理常式代碼 UpdateData(TRUE); HKEY hKEY; LPCTSTR data_Set=_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\");long
好老的技術了,91年的,不過我發現網上介紹的還真不多。steerable
其實寫過一步法二值映像連通地區標記之後我就感覺這個標記和填充基本上是一回事,所以我這裡就用了一步法的那個隊列演算法。也沒什麼好說的,演算法幾乎一樣,就是細節的區別。還有這裡使用了ginput函數。至於堆棧版的實現,看情況吧。clear all;close all;clc;img=imread('liantong.bmp');img=img>128;img=mat2gray(img);imshow(img);[m n]=size(img);[x
主要功能是提取映像的骨架,方法是不斷對映像進行腐蝕並且標記每個像素腐蝕到值不再變化的次數。clear all;close all;clc;img=imread('5.jpg');[m n]=size(img);m=double(m);n=double(n);Min=double(min(img(:))); %不斷腐蝕的結果是像素全為最小值%Max=double(max(img(:))); %不斷膨脹的結果是像素全為最大值w =
長條圖匹配或叫做長條圖規定化都可以,是把原映像的長條圖按照給定的長條圖加以映射,使新映像的長條圖的分布類似於給定的函數。 總共有以下幾步: 1.求給定的函數的累積長條圖s。 2.求原映像的累積長條圖G。 3.求s中每一個值在G中距離最小的位置index。 4.求原映像每個像素通過index映射到的新像素的值。代碼如下:clear all;close all;clc;r=127;
這裡只是簡單的實現一下,這個和長條圖反向投影很像。 書上說了,“優勢是理論上的,很難發展處一種滿意的模板匹配技術”。 代碼:clear all;close all;clc;img=imread('lena.jpg');imshow(img);img=double(img);mask=double(imcrop());[m n]=size(img);[H W]=size(mask);if mod(H,2)~=1 H=H+1;endif mod(W,2)~=1