对象检测算法的有效解决方案

时间:2015-11-15 17:15:54

标签: matlab image-processing

我正在尝试实施这篇论文'按组合划分的显着对象检测'这里是链接:http://research.microsoft.com/en-us/people/yichenw/iccv11_salientobjectdetection.pdf

我已经实现了算法,但执行和显示输出需要很长时间。我在代码中使用4 for循环(使用for循环是我能想到实现此算法的唯一方法。)我在线搜索了MATLAB代码,但找不到任何东西。所以任何人都可以建议任何更快的方法来实现该算法。在论文中,他们(作者)说他们已经使用MATLAB实现了代码并且运行得很快。所以肯定有一种方法可以更有效地编写代码。

我感谢任何有效执行此算法的提示或代码。

clc
clear all
close all

%%instructions to run segment.cpp
%to run this code
%we need an output image
%segment sigma K min input output
%sigma: used for gaussian smoothing of the image 
%K: scale of observation; larger K means larger components in segmentation
%min: minimum component size enforced by post processing

%%
%calculating composition cost for each segment
I_org = imread('segment\1.ppm');
I = imread('segment\output1.ppm');
[rows,cols,dims] = size(I);
pixels = zeros(rows*cols,dims);
red_channel = I(:,:,1);
green_channel = I(:,:,2);
blue_channel = I(:,:,3);
[unique_pixels,count_pixels] = countPixels(I);
no_segments = size(count_pixels,1);
area_segments = count_pixels ./ (rows * cols);
appearance_distance = zeros(no_segments,no_segments);
spatial_distance = zeros(no_segments,no_segments);
thresh = multithresh(I_org,11);
thresh_values = [0 thresh];
for i = 1:no_segments    
    leave_pixel = unique_pixels(i,:);
    mask_image = ((I(:,:,1) == leave_pixel(1)) & (I(:,:,2) == leave_pixel(2)) & (I(:,:,3) == leave_pixel(3)));
    I_i(:,:,1) = I_org(:,:,1) .* uint8((mask_image));
    I_i(:,:,2) = I_org(:,:,2) .* uint8((mask_image));
    I_i(:,:,3) = I_org(:,:,3) .* uint8((mask_image));
    LAB_trans = makecform('srgb2lab');
    I_i_LAB = applycform(I_i,LAB_trans);
    L_i_LAB = imhist(I_i_LAB(:,:,1));
    A_i_LAB = imhist(I_i_LAB(:,:,2));
    B_i_LAB = imhist(I_i_LAB(:,:,3));
    for j = i:no_segments
        leave_pixel = unique_pixels(j,:);
        mask_image = ((I(:,:,1) == leave_pixel(1)) & (I(:,:,2) == leave_pixel(2)) & (I(:,:,3) == leave_pixel(3)));
        I_j(:,:,1) = I_org(:,:,1) .* uint8((mask_image));
        I_j(:,:,2) = I_org(:,:,2) .* uint8((mask_image));
        I_j(:,:,3) = I_org(:,:,3) .* uint8((mask_image));
        I_j_LAB = applycform(I_j,LAB_trans);
        L_j_LAB = imhist(I_j_LAB(:,:,1));
        A_j_LAB = imhist(I_j_LAB(:,:,2));
        B_j_LAB = imhist(I_j_LAB(:,:,3));
        appearance_distance(i,j) = sum(min(L_i_LAB,L_j_LAB) + min(A_i_LAB,A_j_LAB) + min(B_i_LAB,B_j_LAB));
        spatial_distance(i,j) = ModHausdorffDist(I_i,I_j) / max(rows,cols);
    end
end
spatial_distance = spatial_distance ./ max(max(spatial_distance));
max_apperance_distance = max(max(appearance_distance));
composition_cost = ((1 - spatial_distance) .* appearance_distance) + (spatial_distance * max_apperance_distance);
%%  
%input parameters for computation
window_size = 9; %rows and colums are considered to be same
window = ones(window_size);
additional_elements = (window_size - 1)/2;
I_temp(:,:,1) =     [zeros(additional_elements,cols);I(:,:,1);zeros(additional_elements,cols)];
I_new(:,:,1) = [zeros(rows + (window_size - 1),additional_elements)     I_temp(:,:,1) zeros(rows + (window_size - 1),additional_elements)];
I_temp(:,:,2) = [zeros(additional_elements,cols);I(:,:,2);zeros(additional_elements,cols)];
I_new(:,:,2) = [zeros(rows + (window_size - 1),additional_elements)     I_temp(:,:,2) zeros(rows + (window_size - 1),additional_elements)];
I_temp(:,:,3) = [zeros(additional_elements,cols);I(:,:,3);zeros(additional_elements,cols)];
I_new(:,:,3) = [zeros(rows + (window_size - 1),additional_elements)     I_temp(:,:,3) zeros(rows + (window_size - 1),additional_elements)];
cost = zeros(rows,cols);
for i = additional_elements + 1:rows
    for j = additional_elements+1:cols
        I_windowed(:,:,1) = I_new(i-additional_elements:i+additional_elements,i-additional_elements:i+additional_elements,1);
        I_windowed(:,:,2) = I_new(i-additional_elements:i+additional_elements,i-additional_elements:i+additional_elements,2);
        I_windowed(:,:,3) = I_new(i-additional_elements:i+additional_elements,i-additional_elements:i+additional_elements,3);
        [unique_pixels_w,count_pixels_w] = countPixels(I_windowed);
        unique_pixels_w = setdiff(unique_pixels_w,[0 0 0],'rows');
        inside_segment = setdiff(unique_pixels,unique_pixels_w);
        outside_segments = setdiff(unique_pixels,inside_segment);
        area_segment = count_pixels_w;
        for k = 1:size(inside_pixels,1)
            current_segment = inside_segment(k,:);
            cost_curr_seg = sort(composition_cost(ismember(unique_pixels,current_segment,'rows'),:));
            for l = 1:size(cost_curr_seg,2)
                if(ismember(unique_pixels(l,:),outside_segments,'rows') && count_pixels(l) > 0)
                    composed_area = min(area_segment(k),count_pixels(l));
                    cost(i,j) = cost(i,j) + cost_curr_seg(l) * composed_area;
                    area_segment(k) = area_segment(k) - composed_area;
                    count_pixels(l) = count_pixels(l) - composed_area;
                    if area_segment(k) == 0
                        break
                    end
                end
            end
            if area(k) > 0
                cost(i,j) = cost(i,j) + max_apperance_distance *  area_segment(k);
            end
        end
    end
end

cost = cost / window_size;

countPixels函数的代码:

function [unique_rows,counts] = countPixels(I)
    [rows,cols,dims] = size(I);
    pixels_I = zeros(rows*cols,dims);
    count = 1;
    for i = 1:rows
        for j = 1:cols
            pixels_I(count,:) = reshape(I(i,j,:),[1,3]);
            count = count + 1;
        end
    end

    [unique_rows,~,ind] = unique(pixels_I,'rows');
    counts = histc(ind,unique(ind));
end

0 个答案:

没有答案