❶ MATLAB代碼 求分析 何的去霧演算法裡面的暗通道演算法 每一句都是什麼意思啊又分別對應論文里的什麼原理
function dark = darkChannel(imRGB)
r=imRGB(:,:,1);
g=imRGB(:,:,2);
b=imRGB(:,:,3); 分別提取三色的灰度圖
[m n] = size(r); 提取單色圖矩陣的寬度和長度
a = zeros(m,n); 創建m*n的零矩陣a
for i = 1: m
for j = 1: n
a(i,j) = min(r(i,j), g(i,j));
a(i,j)= min(a(i,j), b(i,j)); 依次比較三色分量的最小值提取為暗通道圖
end
end
d = ones(15,15); 創建15*15的單位矩陣
fun = @(block_struct)min(min(block_struct.data))*d;
dark = blockproc(a, [15 15], fun); 將圖片分成15*15的小塊並將每一塊變成其中的最小值
dark = dark(1:m, 1:n);
我也是新手啊兄弟只能幫你到這兒了
❷ 如何對圖像做分類器訓練matlab代碼
對圖像做分類器訓練要建立視覺詞袋來進行圖像分類。該過程生成用來表示圖像視覺詞的直方圖,通過這些直方圖來訓練圖像分類器。下面的步驟描述如何建立圖像集,建立視覺詞袋,以及訓練和運用圖像分類器。
第一步:建立圖像類別集合
將圖像分割成訓練子集和測試子集。利用imageDatastore函數來存儲訓練分類器的圖像。可以利用splitEachLabel函數將圖像分割成訓練數據和測試數據。
讀取類別圖像和創建圖像子集
setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets');
imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource','foldernames');
分割圖集成訓練和測試子集。下例中,30%作為訓練數據,餘下的作為測試數據。
[trainingSet,testSet] = splitEachLabel(imds,0.3,'randomize');
第二步:建立特徵詞袋
通過從每個類別的有代表性的圖像中提取特徵描述符,創建視覺詞彙表或特徵包。
通過在訓練集合中提取出的特徵描述符上利用k-means聚類演算法,bagOfFeatures對象定義特徵,視覺詞彙。該演算法迭代地將描述符分成k個互斥簇。由此產生的簇是緊密的,並具有相似的特性。每個集群中心代表一個特徵,或一個可視詞。可以基於特徵檢測器提取特徵,也可以定義一個網格來提取特徵描述符。網格方法可能丟失細節信息。因此,對不包含明顯特徵的圖像使用網格,例如海灘等景物的圖像。使用Speed up robust features(或SURF)檢測器提供更大的尺度不變性。默認情況下,該演算法運行「網格」方法。
該演算法工作流對圖像進行整體分析。圖像必須有適當的標簽來描述它們所代表的類。例如,一組汽車圖像可以被標記為汽車。工作流不依賴於空間信息,也不依賴於標記圖像中的特定對象。視覺詞袋技術依賴於非局部化的檢測技術。
第三步:通過視覺詞袋訓練圖像分類器
trainImageCategoryClassifier函數返回一個圖像分類器。該方法使用基於2分類支持向量機(SVM)的error-correcting output codes(ECOC)框架來訓練一個多分類器。
該方法利用bagOfFeatures對象返回的視覺詞袋將圖像集中的圖像編碼成視覺詞直方圖。然後將視覺詞直方圖作為訓練分類器的正負樣本。
1、將訓練集中的每幅圖像利用bagOfFeature的encode方法進行編碼。該函數檢測和提取圖像中的特徵,然後利用最近鄰演算法構造每個圖像的特徵直方圖。函數將描述符逼近聚類中心來增加直方圖各bin的數值。直方圖的長度取決於bagOfFeatures對象構造的出來的視覺詞的數量。最終將直方圖作為圖像的特徵向量。
2、對訓練集中的每幅圖像重復步驟1,建立訓練數據
3、評價分類器。在測試圖像集上使用imagecategoryclassifier的evaluate方法測試分類器。輸出混淆矩陣可以分析預測結果。理想的分類結果是對角線上包含一個標准矩陣。不正確的分類導致出現分數值。
第四步:對圖像或圖像集進行分類
最後使用imageCategoryClassifier 的predeict方法對新圖像進行分類來確定其類型。