matlab根據(jù)直方圖進(jìn)行圖片分類(lèi)

感覺(jué)還有一些bug需要調(diào)試,不過(guò)還是先寫(xiě)出來(lái)吧

將一張圖片由rgb轉(zhuǎn)hsv空間,并進(jìn)行量化

function [Hh,Vv,Ss] = hsv_hist(filename)
    % 將rgb轉(zhuǎn)hsv

    %clear;
    clc;
    %filename = 'lena.bmp';
    Image = imread(filename);
    [M,N,O] = size(Image);
    [h,s,v] = rgb2hsv(Image); % 此處的hsv取值范圍都介于0和1之間

    % 分別對(duì)hsv進(jìn)行量化
    % h量化為16級(jí),s量化為4級(jí),v量化為4級(jí)
    h = h.*360;
    H =h;S=s;V=v;

    % 對(duì)h進(jìn)行量化得到H,得到的H空間取值范圍介于0~15
    for i = 1:M
        for j =1:N
            %i,j為橫縱坐標(biāo)
            if h(i,j)<=15||h(i,j)>345
                H(i,j) = 16;
            end
            if h(i,j)<=25&&h(i,j)>15
                H(i,j) = 1;
            end
            if h(i,j)<=45&&h(i,j)>25
                H(i,j) = 2;
            end
            if h(i,j)<=55&&h(i,j)>45
                H(i,j) = 3;
            end
            if h(i,j)<=80&&h(i,j)>55
                H(i,j) = 4;
            end
            if h(i,j)<=108&&h(i,j)>80
                H(i,j) = 5;
            end
            if h(i,j)<=140&&h(i,j)>108
                H(i,j) = 6;
            end
            if h(i,j)<=165&&h(i,j)>140
                H(i,j) = 7;
            end
            if h(i,j)<=190&&h(i,j)>165
                H(i,j) = 8;
            end
            if h(i,j)<=220&&h(i,j)>190
                H(i,j) = 9;
            end
            if h(i,j)<=255&&h(i,j)>220
                H(i,j) = 10;
            end
            if h(i,j)<=275&&h(i,j)>255
                H(i,j) = 11;
            end
            if h(i,j)<=290&&h(i,j)>275
                H(i,j) = 12;
            end
            if h(i,j)<=316&&h(i,j)>290
                H(i,j) = 13;
            end
            if h(i,j)<=330&&h(i,j)>316
                H(i,j) = 14;
            end
            if h(i,j)<=345&&h(i,j)>330
                H(i,j) = 15;
            end
        end
    end

    % 對(duì)s和v進(jìn)行量化 量化空間為1~4
    for i = 1:M
        for j = 1:N
            if s(i,j)<=0.15&&s(i,j)>0
                S(i,j) = 1;
            end
            if s(i,j)<=0.4&&s(i,j)>0.15
                S(i,j) = 2;
            end
            if s(i,j)<=0.75&&s(i,j)>0.4
                S(i,j) = 3;
            end
            if s(i,j)<=1&&s(i,j)>0.75
                S(i,j) = 4;
            end
        end
    end
    for i = 1:M
        for j = 1:N
            if v(i,j)<=0.15&&v(i,j)>0
                V(i,j) = 1;
            end
            if v(i,j)<=0.4&&v(i,j)>0.15
                V(i,j) = 2;
            end
            if v(i,j)<=0.75&&v(i,j)>0.4
                V(i,j) = 3;
            end
            if v(i,j)<=1&&v(i,j)>0.75
                V(i,j) = 4;
            end
        end
    end

    Hh = zeros(16,1);

    for i=1:M
        for j =1:N
            for k = 1:16
                if H(i,j) == k
                    Hh(k,1) = Hh(k,1) + 1;
                    break;
                end
            end
        end
    end

    %至此得到了一幅圖像的Hh量化矩陣

    Ss = zeros(4,1);
    for i = 1:M
        for j =1:N
            for k = 1:4
                if S(i,j) == k
                    Ss(k,1) = Ss(k,1)+1;
                    break;
                end
            end
        end
    end

    Vv = zeros(4,1);
    for i = 1:M
        for j = 1:N
            for k = 1:4
                if V(i,j) == k
                    Vv(k,1) = Vv(k,1) + 1;
                    break;
                end
            end
        end
    end

之后對(duì)圖片進(jìn)行比較

function result = compare(filename1, filename2)

%    clear

    %filename1 = '2416.jpg';
    %filename2 = '19.jpg';

    [h1,s1,v1] = hsv_hist(filename1);
    [h2,s2,v2] = hsv_hist(filename2);

    sub_h = sum(abs(h1-h2));
    sub_s = sum(abs(s1-s2));
    sub_v = sum(abs(v1-v2));

    result = (sub_h+sub_v+sub_s)/3;

測(cè)試了一下

% 找出100副最相近的圖片

clc;
clear;
%待比較的文件
file = '2416.jpg';
directory = 'D:\2019\duomeitiqingbaochuli\homework\image.vary.jpg\image.vary.jpg\';
workspace = 'H:\workspace\matlab\imagepro';
workdir = 'H:\workspace\matlab\imagepro\img';

if exist(workdir)
    rmdir(workdir, 's'); %matlab 刪除目錄和目錄下的文件
    mkdir(workdir);
else
    mkdir(workdir);
end

all_img = dir(directory); %返回的是一個(gè)結(jié)構(gòu)體

all_img_size = size(all_img,1)-2; %計(jì)算出文件數(shù)目




result = zeros(all_img_size,1);
%還是老老實(shí)實(shí)的拼接文件名
for k = 0:all_img_size-1
    filename = [directory, num2str(k), '.jpg'];
    result(k+1) = compare(file, filename);
end

    
% for k =3+2415:all_img_size+2
%     filename = all_img(k).name;
%     result(k-2,1) = compare(file, [directory, filename]);
% end

%對(duì)result進(jìn)行排序
[V,I] = sort(result);

%取出前100個(gè)圖片移動(dòng)到目錄下
for k = 1:100
    move_file = [directory, num2str(I(k,1)), '.jpg'];
    copyfile(move_file,workdir )
end

分類(lèi)的結(jié)果大概如下


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容