-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsobel.m
More file actions
executable file
·110 lines (101 loc) · 3.53 KB
/
sobel.m
File metadata and controls
executable file
·110 lines (101 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
function [ Res ] = sobel( image,kSize,direction,scale )
%apply sobel to image
%% params
%@ image: input of gray-scale.
%@ kSize; size of sobel kernel, which must be odd.
%@ direction: a character indicating orientations of gradients, must be one of {'x','y'}.
%@ scale: scale for the computed derivative values.
%%
rows = size(image,1);
cols = size(image,2);
Res = zeros(rows,cols);
if(mode(kSize,2)==0 || kSize<=1)
fprintf('Improper kSize!\n');
end
[kx,ky] = makeSobelKer(kSize,direction);
Res = sepFilter2D(image,kx,ky,scale);
%% ----------------------deprecated----------------------------
%{
rows = size(image,1);
cols = size(image,2);
sobel = [-1 0 1;
-2 0 2;
-1 0 1];
if (r==1)
if (c==1)
block=[image(2,2) image(2,1) image(2,2);
image(1,2) image(1,1) image(1,2);
image(2,2) image(2,1) image(2,2)];
elseif (c==cols)
block=[image(2,cols-1) image(2,cols) image(2,cols-1);
image(1,cols-1) image(1,cols) image(1,cols-1);
image(2,cols-1) image(2,cols) image(2,cols-1)];
else
block=[image(r+1,c-1) image(r+1,c) image(r+1,c+1);
image(r,c-1) image(r,c) image(r,c+1);
image(r+1,c-1) image(r+1,c) image(r+1,c+1)];
end
elseif (r==rows)
if (c==1)
block = [image(r-1,2) image(r-1,1) image(r-1,2);
image(r,2) image(r,1) image(r,2);
image(r-1,2) image(r-1,1) image(r-1,2)];
elseif(c==cols)
block = [image(r-1,c-1) image(r-1,c) image(r-1,c-1);
image(r,c-1) image(r,c) image(r,c-1);
image(r-1,c-1) image(r-1,c) image(r-1,c-1)];
else
block = [image(r-1,c-1) image(r-1,c) image(r-1,c+1);
image(r,c-1) image(r,c) image(r,c+1);
image(r-1,c-1) image(r-1,c) image(r-1,c+1)];
end
elseif((c>1) && (c<cols))
block= image(r-1:r+1,c-1:c+1);
else
if c==1
block = [image(r-1,2) image(r-1,1) image(r-1,2);
image(r,2) image(r,1) image(r,2);
image(r+1,2) image(r+1,1) image(r+1,2)];
elseif c==cols
block = [image(r-1,cols-1) image(r-1,cols) image(r-1,cols-1);
image(r,cols-1) image(r,cols) image(r,cols-1);
image(r+1,cols-1) image(r+1,cols) image(r+1,cols-1)];
end
end
conv = block .* sobel;
newPix = sum(conv(:));
end
%}
end
function [kx,ky] = makeSobelKer(kSize,direction)
% return horizontal and vertical 1D sobel kernels
%% params:
%@ kSize: size of sobel kernel, which must be odd.
%@ direction: a character indicating orientations of gradients, must be one of {'x','y'}.
%%
if direction == 'x'
ker = [-1 0 1;
-2 0 2;
-1 0 1];
elseif direction == 'y'
ker = [-1 -2 -1;
0 0 0;
1 2 1];
else
kx = [];ky=[];
fprintf('Error: direction is either ''x'' or ''y''!\n');
return ;
end
cnt =(kSize-1)/2;
smoothKer = [1 2 1]'*[1 2 1];
for i = 1 : cnt-1
ker = conv2(smoothKer,ker);
end
if(direction == 'x')
kx = ker(1,:);
ky = -ker(:,1);
else
kx = -ker(1,:);
ky = ker(:,1);
end
end