利用影象的直方圖幫助選擇閾值是常用的方法,其中的關鍵是確定峰點和谷點。由於場景的複雜性,影象成像過程中各種干擾因素的存在等原因,峰點和谷點的有無檢測和位置確定常常比較困難。峰點和谷點的檢測和直方圖的尺度有密切的聯絡。一般在較大尺度下常能較可靠地檢測到真正的峰點和谷點,但在大尺度下對峰點和谷點的定位不易準確。相反,在較小尺度下對真正峰點和谷點的定位常常比較準確,但在小尺度下誤檢或漏檢的比例會增加。因此可以考慮進行多解析度峰谷探測,在較大尺度下檢測峰谷的有無,再在精細尺度下確定峰谷的位置。
具體來說,多尺度是通過調節高斯濾波器的sigma實現的。濾波平滑後訊號(直方圖)的二階導的過零點對應著訊號的拐點,即波峰或波谷的起始或終止點(波峰的起始點可視為波谷的終止點)。其中,從負值到正值的零交叉點對應峰的終點,從正值到負值的零交叉點對應峰的起點。在波峰的起點與終點之間的最大值點對應該尺度下峰的位置,在波峰的終點與下乙個波峰的起點之間的最小值點對應該解析度下波谷的位置。原理參見下面示意圖(其中黃線代表放大後的二階導):
在確定了乙個尺度的峰谷位置後,通過向上一尺度(更低尺度)搜尋與當前尺度下波峰/波谷距離最近的波峰/波谷位置來替代當前尺度下的波峰/波谷位置來進行更精確的定位。該過程從最大尺度不斷向上迭代,直到到達設定的起始尺度(可以是原始解析度)為止。
clear all;close all;clc;
x=(pi/50)*(1:256);
hist=50*cos(x)+30*cos(2*x)+randi([1,10],[1,256]);
figure,plot(1:256,hist);
%%[top,bottom]=multiscalethselect(hist,3,1);
function [top,bottom]=multiscalethselect(hist,s,s0)
if ~exist('s0','var')
s0=0;
end% 多尺度閾值選取
% s為總的分解層數
% s0為起始尺度,0則對應原始解析度
% 各層解析度分別為2^(s-1), s=1,2,...s
hist=reshape(hist,[1,length(hist)]);
multiscaletop=cell(s+1-s0,1);
multiscalebottom=cell(s+1-s0,1);
for s=s:-1:s0
if s>0
sigma=2^(s-1);
f=fspecial('gaussian',[1,6*sigma],sigma);
fhist=imfilter(hist,f,'symmetric');
else
fhist=hist;
endd2f_fhist=diff(diff(fhist));
d2f_fhist=[d2f_fhist(1) d2f_fhist(1) d2f_fhist];
zeropt=; %二階導過零點,為nx2矩陣,第一列標記位置,第二列標記過零點型別
for i=2:length(hist)-1
if d2f_fhist(i-1)<0 && d2f_fhist(i+1)>0
zeropt=[zeropt;i,-1]; %峰的終點
else
if d2f_fhist(i-1)>0 && d2f_fhist(i+1)<0
zeropt=[zeropt;i,1]; %峰的起點
endend
endtop=;
bottom=;
for i=2:length(zeropt)
if zeropt(i-1,2)==-1 && zeropt(i,2)==1
interval=fhist(zeropt(i-1,1):zeropt(i,1));
index=find(interval==min(interval));
bottom=[bottom,zeropt(i-1,1)-1+index(1)];
elseif zeropt(i-1,2)==1 && zeropt(i,2)==-1
interval=fhist(zeropt(i-1,1):zeropt(i,1));
index=find(interval==max(interval));
top=[top,zeropt(i-1,1)-1+index(1)];
endend
if s0>0
multiscaletop(s)=;
multiscalebottom(s)=;
else
multiscaletop(s+1)=;
multiscalebottom(s+1)=;
endendtop=multiscaletop;
bottom=multiscalebottom;
for i=s-s0:-1:1
for k=1:length(top)
dis=abs(multiscaletop-top(k));
index=find(dis==min(dis(:)));
top(k)=multiscaletop(index(1));
endfor k=1:length(bottom)
dis=abs(multiscalebottom-bottom(k));
index=find(dis==min(dis(:)));
bottom(k)=multiscalebottom(index(1));
endendtop=unique(top);
bottom=unique(bottom);
end
Android解析度常識 多解析度適配
螢幕大小 以螢幕對角線的物理長度來衡量螢幕的大小 解析度 螢幕中所有物理畫素點數。如1920x1080,就表示寬方向有1920個畫素,高方向有1080個畫素,整個螢幕有2073600個畫素。螢幕密度 dpi dots per inch 即畫素密度,每英吋面積上存在多少個畫素。160dpi表示單位面積...
android多解析度支援
螢幕尺寸 螢幕的物理尺寸,以螢幕的對角線長度作為依據 比如 2.8寸,3.5寸 簡而言之,android把所有的螢幕尺寸簡化為三大類 大,正常,和小。程式可以針對這三種尺寸的螢幕提供三種不同的布局方案,然後系統會負責把你的布局方案以合適的方式渲染到對應的螢幕上,這個過程是不需要程式設計師用 來干預的...
adnriod 多解析度適配
如何將乙個應用程式適配在不同的手機上,雖然這不算是乙個技術問題,但是對於剛剛做螢幕的開發人員來說,還真不是一件多麼簡單的事情。首先 你需要在androidmanifest.xml檔案的元素如下新增子元素 android normalscreens true android anydensity tr...