%%==============================================
%===Author:zdm
%===Time:2014年4月
%===Function:HC显著性检测实现=======单张图片实验
%===Description:
%===Email:daimingzhang@126.com
%===Reference:基于全局对比度的显著性检测
%=== Global Contrast based Salient Region Detection(CVPR2011)
%%=========================================================================
%%===== Step1:图像数据读取以及颜色空间选择
OriImageColor=imread('E:\1A\Imgs\0_0_818.jpg');
if(size(OriImageColor,3)>1)
OriImageGray=rgb2gray(OriImageColor);
else
OriImageGray = OriImageColor;
end
%%===Step2: 参数设置
[mRow,mCol,ChannelNum]=size(OriImageColor);
KeepRate=0.95; %只考虑颜色直方图中出现频率前KeepRate的像素
ChannelColorNum=12; %每个颜色通道量化后的颜色数量
PixelMaxOri=255; %每个通道里面像素最大值
TotalPixel=mRow*mCol; % 总像素数目
PixellCurDist=(PixelMaxOri+1)/ ChannelColorNum;
%%===Step3:颜色空间量化
ImageDataChannel=cell(ChannelNum,1);
for iChannel=1:ChannelNum
ImageDataChannel{iChannel}=single(OriImageColor(:,:,iChannel));
% ImageDataChannel{iChannel}=floor(ImageDataChannel{iChannel}*(ChanelColorNum-1)/(PixelmaxOri);
for i=1: ChannelColorNum
curMin=(i-1)*PixellCurDist;
curMax=i* PixellCurDist;
temp= ImageDataChannel{iChannel};
temp(temp>=curMin & temp<curMax)=i-1;
ImageDataChannel{iChannel}=temp;
end
end
%%===Step4:颜色直方图统计
TotoalPixelVec=zeros(ChannelColorNum^ChannelNum,1);
ColorMapMatrix=zeros(mRow,mCol); % 当前像素和量化后颜色表的映射
Jinzhi1=(ChannelColorNum)^1;
Jinzhi2=(ChannelColorNum)^2;
for i=1:mRow
for j=1:mCol
% for k=1:ChannelNum
% pixelValue= pixelValue+ImageDataChannel{k}(i,j)*( ChannelColorNum-1)^( ChannelNum-k);
% end
pixelValue= ImageDataChannel{1}(i,j)*Jinzhi2+ ImageDataChannel{2}(i,j)*Jinzhi1+ ImageDataChannel{3}(i,j);
ColorMapMatrix(i,j)=pixelValue+1;
TotoalPixelVec(pixelValue+1)=TotoalPixelVec(pixelValue+1)+1;
end
end
TotoalPixelVec=single(TotoalPixelVec)/TotalPixel;
[SortedTotoalPixelVec,pixelPos]=sort(TotoalPixelVec,'descend');
%%===Step5:颜色直方图后处理,丢弃部分稀少像素
sumPixelNum=0;
PixelNum=size(SortedTotoalPixelVec,1);
KeepPos=0;
for i=1:PixelNum %=可以反着计算1-KeepRate适当加速
sumPixelNum=sumPixelNum+SortedTotoalPixelVec(i);
if(sumPixelNum>=KeepRate)
KeepPos=i;
break;
end
end
%==剩下(1-KeepRate)的元素用嘴里最近的像素替代
RGBColorSpace=zeros(PixelNum,3);
for i=1:PixelNum
tempColor=pixelPos(i);
B1=mod(tempColor,ChannelColorNum);
G1=mod((tempColor-B1),(ChannelColorNum)^2)/(ChannelColorNum);
R1=floor(tempColor/((ChannelColorNum)^2));
RGBColorSpace(i,:)=[R1,G1,B1];
end
for i=KeepPos+1:PixelNum
curMin=256^3;
curNearstPos=1;
for j=1:KeepPos
dist=sqrt((RGBColorSpace(j,1)-RGBColorSpace(i,1))^2+(RGBColorSpace(j,2)-RGBColorSpace(i,2))^2+(RGBColorSpace(j,3)-RGBColorSpace(i,3))^2);
if (dist<curMin)
curMin=dist;
curNearstpos=j;
end
end
%====重新统计像素频率
SortedTotoalPixelVec(curNearstPos)=SortedTotoalPixelVec(curNearstPos)+SortedTotoalPixelVec(i);
SortedTotoalPixelVec(i)=0; % keepos 后面的像素频率不再考虑,置为零
%==更新颜色映射表
ColorMapMatrix(ColorMapMatrix==pixelPos(i))=pixelPos(curNearstPos);
%==keepos后面的像素改为替换的元素
pixelPos(i)=pixelPos(curNearstPos);
end
%==更新RGBColorSpace的值
temp1=OriImageColor(:,:,1);
temp2=OriImageColor(:,:,2);
temp3=OriImageColor(:,:,3);
for i=1:KeepPos
RGBColorSpace(i,1)=sum(temp1(ColorMapMatrix==pixelPos(i)))/(SortedTotoalPixelVec(i)*TotalPixel);
RGBColorSpace(i,2)=sum(temp2(ColorMapMatrix==pixelPos(i)))/(SortedTotoalPixelVec(i)*TotalPixel);
RGBColorSpace(i,3)=sum(temp3(ColorMapMatrix==pixelPos(i)))/(SortedTotoalPixelVec(i)*TotalPixel);
%
RGBColorSpace(i,:)=sum(OriImageColor(ColorMapMatrix==pixelPos(i)))/(SortedTotoalPixelVec(i)*TotalPixel);
end
%%===Step6: 颜色显著性度量
ColorDistMatric=zeros(KeepPos,KeepPos);%保存任意两个颜色之间的Lab空间的距离
SalPerColor=zeros(PixelNum,1);
LabColorSpace=zeros(KeepPos,3);
for i=1:KeepPos
B=RGBColorSpace(i,3)/PixelMaxOri;
G=RGBColorSpace(i,2)/PixelMaxOri;
R=RGBColorSpace(i,1)/PixelMaxOri;
%Three(:,:,1)=R;
%Three(:,:,2)=G;
%Three(:,:,3)=B;
[L,a,b]=RGB2Lab_(R,G,B);
LabColorSpace(i,:)=[L,a,b];
end
for i=1:KeepPos
for j=1:KeepPos
% if( i==j)
% ColorDistMatric(i,j)=0;
% ColorDistMatric(j,i)=0;
% continue;
% end
ColorDistMatric(i,j)=sqrt((LabColorSpace(j,1)-LabColorSpace(i,1))^2+(LabColorSpace(j,2)-LabColorSpace(i,2))^2+(LabColorSpace(j,3)-LabColorSpace(i,3))^2);
SalPerColor(i)=SalPerColor(i)+SortedTotoalPixelVec(j)*ColorDistMatric(i,j);
end
end
%==归一化
% % % temp=SalPerColor(1:KeepPos)’;
% % % temp=mapminmax(temp,0,1);
% % % SalPercolor(1:KeepPos)=temp’;
%%===Step7:颜色空间平滑
BlurSalPerColor=zeros(PixelNum,1);%平滑后的颜色显著性值
nearMnumer=floor(KeepPos/4);
for i=1:KeepPos
DisRow=ColorDistMatric(i,:);
[SortedDistRow,Pos]=sort(DisRow);
T=0;
for j=2:nearMnumer+1
T=T+SortedDistRow(j);
end
for j=2:nearMnumer+1
BlurSalPerColor(i)= BlurSalPerColor(i)+(T- SortedDistRow(j))*SalPerColor(Pos(j));
end
BlurSalPerColor(i)= BlurSalPerColor(i)/((nearMnumer-1)*T);
end
%%===Step8:结果数据处理
%%==归一化【0,1】
temp=BlurSalPerColor(1:KeepPos)';
temp=mapminmax(temp,0,1);
BlurSalPerColor(1:KeepPos)=temp';
HCSalMap=zeros(mRow,mCol);
HCSalMapBlur=zeros(mRow,mCol);
BlurSalPerColor(KeepPos+1:PixelNum)=0;
SalPerColor(KeepPos+1:PixelNum)=0;
MainColor=pixelPos(1:KeepPos);
for i=1:mRow
for j=1:mCol
% temp=find(MainColor==ColorMapMatrix(i,j));
% if(isempty(temp)==0)
HCSalMap(i,j)=SalPerColor(MainColor==ColorMapMatrix(i,j));
HCSalMapBlur(i,j)=BlurSalPerColor(MainColor==ColorMapMatrix(i,j));
% else
% HCSalMap(I,j)=SalPerColor(KeepPos);
% HCSalMapBlur(I,j)=BlurSalPerColor(KeepPos);
% end
end
end
%==高斯平滑
f=fspecial('gaussian',[3 3],1);% 高斯模版
HCSalMap_Gauss=imfilter(HCSalMap,f,'same');%滤波
HCSalMapBlur_Gauss=imfilter(HCSalMapBlur,f,'same');%滤波
%
%
%
%
%
%=======================绘图===========
figure(1);
subplot(121);imshow(HCSalMap,[]);
subplot(122);imshow(OriImageColor);
figure(2);
subplot(121);imshow(HCSalMapBlur,[]);
subplot(122);imshow(OriImageColor);
figure(3);
subplot(121);imshow(HCSalMap_Gauss,[]);
subplot(122);imshow(OriImageColor);
figure(4);
subplot(121);imshow(HCSalMapBlur_Gauss,[]);
subplot(122);imshow(OriImageColor);
%%=================================================