Реализация Prewitt Filter Matlab

Я пытаюсь реализовать фильтр Превитта в Matlab. Я знаю, что в Matlab уже есть такой фильтр, но мне нужно самому его закодировать. Ниже мой код, единственная проблема в том, что в конце фильтрации я получаю яркое изображение вместо того, чтобы видеть края. Я реализую фильтр, используя свойство разделимости фильтра Превитта. Есть идеи? Я буду очень признателен за вашу помощь.

%% 3x3 Prewitt Filter
close all
imageIn = imread('images/Bikesgray.jpg');

imageGx = zeros(size(imageIn));
imageGy = zeros(size(imageIn));
imageOut = zeros(size(imageIn));

ny = size(imageIn, 1);
nx = size(imageIn, 2);
average = 3;

imshow(imageIn);

u = [];
v = [];

tic
%Compute Gx
%For every row use the mask (-1 0 1)
for i = 1:ny
    u = imageIn(i,:);
    v = zeros(1, nx);
    for k = 2:nx-1
        v(k) = (uint32(-1*u(k-1))+uint32(0*u(k))+uint32(u(k+1)));
    end
    v(1) = (uint32(-1*u(2))+uint32(0*u(1))+uint32(u(2)));
    v(nx) = (uint32(-1*u(nx-1))+uint32(0*u(nx))+uint32(u(nx-1)));
    imageGx(i,:) = v;
end
%For every column use the mask (1 1 1)
for j = 1:nx
    u = imageGx(:,j);
    v = zeros(ny, 1);
    for k = 2:ny-1
        v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)));
    end
    v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)));
    v(ny) = (uint32(u(ny-1))+uint32(u(ny))+uint32(u(ny-1)));
    imageGx(:,j) = v;
end
%Compute Gy
%For every row use the mask (1 1 1)
for i = 1:ny
    u = imageIn(i,:);
    v = zeros(1, nx);
    for k = 2:nx-1
        v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)));
    end
    v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)));
    v(nx) = (uint32(u(nx-1))+uint32(u(nx))+uint32(u(nx-1)));
    imageGy(i,:) = v;
end
%For every column use  the mask (1 0 -1)
for j = 1:nx
    u = imageGy(:,j);
    v = zeros(ny, 1);
    for k = 2:ny-1
        v(k) = (uint32(u(k-1))+uint32(0*u(k))+uint32(-1*u(k+1)));
    end
    v(1) = (uint32(u(2))+uint32(0*u(1))+uint32(-1*u(2)));
    v(ny) = (uint32(u(ny-1))+uint32(0*u(ny))+uint32(-1*u(ny-1)));
    imageGy(:,j) = v;
end

toc

figure
imshow(imageGx, [0 255]);

figure
imshow(imageGy, [0 255]);

%Compute the magnitude G = sqrt(Gx^2 + Gy^2);
imageOut(:,:) = sqrt(imageGx(:,:).^2 + imageGy(:,:).^2);
figure
imshow(imageOut, [0 255]);

person BRabbit27    schedule 11.11.2012    source источник


Ответы (2)


Жаль, что вы не использовали convn (свертку), так как взвешенная сумма просто кричит. В двух словах, вы создаете Gx,Gy, используя convn на матрице изображения, используя соответствующие ядра, как описано в википедии

person boyo    schedule 13.12.2012
comment
Да... ну, иногда мне нужно изучить основы, программируя подобные вещи. Я знаю, что у Matlab очень хорошая реализация свертки. - person BRabbit27; 14.12.2012

Решение было действительно очевидным, но мне потребовалось некоторое время, чтобы понять его. Все, что я сделал, это изменил uint32 на int32 и обязательно выполнил операции (например, умножение на -1) после изменения значений с uint32 на int32.

person BRabbit27    schedule 11.11.2012