幾種簡單經常使用的鏡頭邊緣檢測算法(matlab實現)

 

在作鏡頭檢測以前,爲方便起見,咱們先將一個視頻短片提取出必定數量的圖像序列。 算法

%%%%%提取圖片序列%%%%%%%
video=mmreader('test.avi','Tag','Reader');
NOF=video.NumberOfFrames;
Img_diff=zeros(NOF-1,1);
mkdir([cd,'/images']);
directory=[cd,'/images/'];
for i=1:NOF
    Img_I=read(video,i);
    imwrite(Img_I,[directory,[num2str(i) '.jpg'];]);
end; ide

鏡頭邊緣檢測算法要作的是檢測出一段視頻片斷中發生鏡頭切換的圖像幀。通常在同一個鏡頭中,相鄰的圖像幀是類似的,因此能夠經過檢測相鄰圖像幀特徵的突變來實現。如下是經典的幾種算法。這些算法其實都離不開重要的兩點,怎麼定義圖像的特徵怎麼斷定類似函數

絕對幀間差法:比較相鄰圖像幀像素的亮度和之差,當大於某個閾值時,則斷定發生突變。這種算法閾值的選取會影響準確度。而對於閾值的肯定,應該還有改進的空間,此處簡單的取全局平均值的1.1倍爲閾值。 測試

for i=1:NOF-1
    img_i=imread(strcat('images\',imglist(i).name));
    img_i_plus=imread(strcat('images\',imglist(i+1).name));
    img_diff(i)=norm(double(img_i(:,:,1)-img_i_plus(:,:,1)))+norm(double(img_i(:,:,2)-img_i_plus(:,:,2)))+norm(double(img_i(:,:,3)-img_i_plus(:,:,3)));
end;
Threshold=mean(img_diff)*1.1;
for i=2:NOF-2
   if(img_diff(i)>img_diff(i-1)&&img_diff(i)>img_diff(i+1)&&img_diff(i)>Threshold)
       fprintf('%d\n',i);
   end;
end; spa

顏色直方圖法:這種算法以圖像的顏色直方圖爲圖像特徵,用直方圖的交來衡量圖片間的類似度。當類似度低於某個閾值時,則斷定爲突變。 orm

其實類似度的定義也很靈活,這裏也只是提供了一個思路。 視頻

clc;clear;clf;
d=dir('images');
NOF=max(size(d)-2);
img_diff=zeros(NOF-1,1);
imglist=d(3:NOF+2);
Threshold=0.45;
for i=1:NOF-1
    img_i=imread(strcat('images\',imglist(i).name));
    img_i_plus=imread(strcat('images\',imglist(i+1).name));
    Hist1=imhist(rgb2gray(img_i));
    Hist2=imhist(rgb2gray(img_i_plus));
    S=min(Hist1(1),Hist2(1));
    for j=2:length(Hist1)
        S=S+min(Hist1(j),Hist2(j));
    end;
    H=sum(Hist1);
    img_diff(i)=S/H;
end;
for i=1:length(img_diff)
    if(img_diff(i)<Threshold)
       fprintf('%d\n',i);
   end;
end; htm

感知哈希法:感知哈希法是用於類似圖片搜索的一種快速算法。因爲鏡頭檢測算法所面向的對象也是成千上百幀的圖像幀,因此我嘗試將這種算法用於鏡頭檢測。 對象

clc;clear;clf;
d=dir('images');
NOF=max(size(d)-2);;
imglist=d(3:NOF+2);
Threshold=6;
count=zeros(NOF-1,1);
for i=1:NOF-1
    img_i=imread(strcat('images\',imglist(i).name));
    img_i_plus=imread(strcat('images\',imglist(i+1).name));
    imbw_i=im2bw(rgb2gray(imresize(img_i,[8,8])));
    imbw_i_plus=im2bw(rgb2gray(imresize(img_i_plus,[8,8])));
    for j=1:8
        for k=1:8
            if(imbw_i(j,k)~=imbw_i_plus(j,k))
                count(i)=count(i)+1;
            end;
        end;
    end; 
end;
for i=1:NOF-2
    if(count(i)>Threshold)
       fprintf('%d\n',i);
   end;
end; 圖片

圖片相關係數法:咱們知道,數學上用 相關係數來表示兩個隨機變量的相關性。我嘗試定義兩幅圖像的相關係數來衡量相鄰圖像幀的類似性。

 

clc;clear;clf; d=dir('images'); NOF=max(size(d)-2); img_sim=zeros(NOF-1,1); imglist=d(3:NOF+2);   for i=1:NOF-1     img_i=imread(strcat('images\',imglist(i).name));     img_i_plus=imread(strcat('images\',imglist(i+1).name));     img_sim(i)=corr2(img_i(:,:,1),img_i_plus(:,:,1))+corr2(img_i(:,:,2),img_i_plus(:,:,2))+corr2(img_i(:,:,3),img_i_plus(:,:,3));     img_sim(i)=img_sim(i)/3; end; Threshold=0.05; for i=1:length(img_sim)     if(img_sim(i)<Threshold)        fprintf('%d\n',i);    end; end;

通過測試檢驗,發現以上的算法雖然能大體檢測出一些鏡頭,可是準確率不是很理想,尤爲是對漸變的鏡頭。總的來講這幾個算法都太粗糙了,究其緣由。一個是對於特徵的定義太過單一,沒法全美的反應圖片的特徵,另外對於類似度函數的定義或者閾值(能夠考慮自適應的閾值)的肯定也有待改進。
相關文章
相關標籤/搜索