matlab处理亮度不均匀,校正亮度不均匀问题并分析前景对象
預(yù)處理圖像
將圖像讀入工作區(qū)。
I = imread('rice.png');
imshow(I)
圖像中心的背景亮度比底部亮度高。預(yù)處理圖像,使背景亮度更加均勻。
第一步,使用形態(tài)學(xué)開運算刪除所有前景(米粒)。開運算會刪除無法完全包含結(jié)構(gòu)元素的小對象。定義半徑為 15 的盤形結(jié)構(gòu)元素,它完全可放入一粒米內(nèi)。
se = strel('disk',15)
se =
strel is a disk shaped structuring element with properties:
Neighborhood: [29x29 logical]
Dimensionality: 2
要執(zhí)行形態(tài)學(xué)開運算,請使用具有結(jié)構(gòu)元素的 imopen。
background = imopen(I,se);
imshow(background)
從原始圖像 I 中減去背景逼近圖像 background,然后查看生成的圖像。從原始圖像中減去調(diào)整后的背景圖像后,生成的圖像具有均勻的背景,但現(xiàn)在對于分析來說有點暗。
I2 = I - background;
imshow(I2)
使用 imadjust,通過在低強(qiáng)度和高強(qiáng)度下都對 1% 的數(shù)據(jù)進(jìn)行飽和處理,并通過拉伸強(qiáng)度值以填充 uint8 動態(tài)范圍,來提高處理后的圖像 I2 的對比度。
I3 = imadjust(I2);
imshow(I3)
請注意,前面的兩個步驟可以由使用 imtophat 的一個步驟來代替完成,后者先計算形態(tài)學(xué)開運算,然后從原始圖像中減去它。
I2 = imtophat(I,strel('disk',15));
創(chuàng)建處理后的圖像的二值版本,以便使用工具箱函數(shù)進(jìn)行分析。使用 imbinarize 函數(shù)將灰度圖像轉(zhuǎn)換為二值圖像。使用 bwareaopen 函數(shù)去除圖像中的背景噪聲。
bw = imbinarize(I3);
bw = bwareaopen(bw,50);
imshow(bw)
識別圖像中的對象
現(xiàn)在您已創(chuàng)建原始圖像的二值版本,您可以對圖像中的對象執(zhí)行分析。
在二值圖像中查找所有連通分量(對象)。結(jié)果的準(zhǔn)確度取決于對象的大小、連通性參數(shù)(4、8 或任意值),以及是否有相互接觸的對象(在這種情況下,它們可能被標(biāo)記為一個對象)。二值圖像 bw 中的一些米粒相互接觸。
cc = bwconncomp(bw,4)
cc = struct with fields:
Connectivity: 4
ImageSize: [256 256]
NumObjects: 95
PixelIdxList: {1x95 cell}
cc.NumObjects
ans = 95
查看圖像中標(biāo)記為 50 的米粒。
grain = false(size(bw));
grain(cc.PixelIdxList{50}) = true;
imshow(grain)
通過創(chuàng)建標(biāo)簽矩陣,然后將其顯示為偽彩色索引圖像,可視化圖像中的所有連通分量。
使用 labelmatrix 根據(jù) bwconncomp 的輸出創(chuàng)建標(biāo)簽矩陣。請注意,labelmatrix 將標(biāo)簽矩陣存儲在依對象數(shù)量得出的最小數(shù)值類中。
labeled = labelmatrix(cc);
whos labeled
Name Size Bytes Class Attributes
labeled 256x256 65536 uint8
使用 label2rgb 選擇顏色圖、背景顏色以及標(biāo)簽矩陣中的對象如何映射到顏色圖中的顏色。在偽彩色圖像中,用于標(biāo)識標(biāo)簽矩陣中每個對象的標(biāo)簽映射到相關(guān)聯(lián)的顏色圖矩陣中的不同顏色。
RGB_label = label2rgb(labeled,'spring','c','shuffle');
imshow(RGB_label)
計算基于面積的統(tǒng)計量
使用 regionprops 計算圖像中每個對象的面積。每個米粒均為 cc 結(jié)構(gòu)體中的一個連通分量。
graindata = regionprops(cc,'basic')
graindata=95×1 struct array with fields:
Area
Centroid
BoundingBox
創(chuàng)建新向量 grain_areas,它保存每個米粒的面積測量值。
grain_areas = [graindata.Area];
計算第 50 個分量的面積。
grain_areas(50)
ans = 194
找到并顯示面積最小的米粒。
[min_area, idx] = min(grain_areas)
min_area = 61
idx = 16
grain = false(size(bw));
grain(cc.PixelIdxList{idx}) = true;
imshow(grain)
使用 histogram 命令創(chuàng)建米粒面積的直方圖。
histogram(grain_areas)
title('Histogram of Rice Grain Area')
總結(jié)
以上是生活随笔為你收集整理的matlab处理亮度不均匀,校正亮度不均匀问题并分析前景对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全面系统地总结Linux的基本操作(上)
- 下一篇: matlab人脸追踪,求大神帮助我这个菜