No BSD License  

Highlights from
Oil Paint Effect

from Oil Paint Effect by Ahmed Hassan
This m file performs an Oil Paint effect on an input image.

oil_paint.m
clc;
clear all;

in_img = imread('sofa.JPG');
in_img = rgb2gray(in_img);
size_in_img_x = size(in_img);
size_in_img = size(in_img);

n = input('Please Enter The Amount of Oil Painting Effect You Desire: ');
mask = ones(n,n);
% find centre_pixel of mask. this is for masks of odd sizes only.
size_mask = size(mask);
centre_index = [ceil((size_mask(1))/2) ceil((size_mask(2))/2)];

% padding image with enough rows and coulumns so that mask can be applied on the first pixel without raising exceptions.
pad_u = uint8([]);
for x = centre_index(1)-1:-1:1
    size_pad_u = size(pad_u);
    pad_u(size_pad_u(1)+1,:) = in_img(1,:);
end
pad_d = uint8([]);
for x = centre_index(1)+1:size_mask(2)
    size_pad_d = size(pad_d);
    pad_d(size_pad_d(1)+1,:) = in_img(size_in_img(1),:);
end
in_img = vertcat(pad_u,in_img,pad_d);
size_in_img = size(in_img);
pad_l = uint8([]);
for x = centre_index(2)-1:-1:1
    size_pad_l = size(pad_l);
    pad_l(:,size_pad_l(2)+1) = in_img(:,1);
end
pad_r = uint8([]);
for x = centre_index(2)+1:size_mask(2)
    size_pad_r = size(pad_r);
    pad_r(:,size_pad_r(2)+1) = in_img(:,size_in_img(2));
end
in_img = horzcat(pad_l,in_img,pad_r);

tic
%main oil painting computation
out_img = uint8(zeros(size_in_img_x(1),size_in_img_x(2)));
win = uint8([]);
index = uint8([]);
for i = 1:size_in_img_x(1)
    if (i>=centre_index(1))
        limit_u = i - floor(size_mask(1)/2);
    else
        limit_u = 1;
    end
    limit_d = i + floor(size_mask(1)/2);
    for j = 1:size_in_img_x(2)
        value = uint8(zeros(1,256));
        if (j>=centre_index(2))
            limit_l = j - floor(size_mask(2)/2);
        else
            limit_l = 1;
        end
        limit_r = j + floor(size_mask(2)/2);
        for x = limit_u:limit_d
            for y = limit_l:limit_r
                value(in_img(x,y)+1) = value(in_img(x,y)+1)+1;
            end
        end        
        [win,index] = max(value);
        out_img(i,j) = index-1;
    end
end
toc
figure
imshow(in_img);
figure
imshow(out_img, [1 255]);

Contact us at files@mathworks.com