color_img = imread('0k4Kh.jpg');
img = rgb2gray(color_img);
[x, y] = size(img);
for i = 1:x
if length(find(img(i, :))) ~= 0
lastmarginalrow = i-1;
break;
end
end
for ii = y:-1:1
if length(find(img(:, ii))) ~= 0
lastmarginalcol = ii-1;
break;
end
end
figure;
fig = imshow(color_img);
h = impoly(gca, [0,x; lastmarginalcol,x; lastmarginalcol,lastmarginalrow; 0,lastmarginalrow]);
api = iptgetapi(h);
api.setColor('red');
saveas(fig, 'test.jpg');
close all;
Here is the implementation in MATLAB. Find zeros column and zeros row and draw a border using them.
For Rotated Images (should work for non-rotated also)
color_img = imread('N6vK9.png');
img = rgb2gray(color_img);
[x, y] = size(img);
verts = [];
% traversing through all columns
for i = 1:y
% find all non-zero pixels in each column
nonzeros = find(img(:,i));
% if all pixels are black in a column, below if condition will skip
if length(nonzeros) ~= 0
% if there is atleast one non-zero pixel, not that co-oridinate/positions in matrix by appending
verts = [i, nonzeros(1); verts];
end
end
figure;
fig = imshow(color_img);
% polygon based on first and last vertix/co-ordinate of found non-zero co-ordinates
% Assumed that it was slanted straight line, used last and first co-ordinate. If it is curvy border, anyways we have all veritices/co-ordinates of first non-zero pixel in all columns.
h = impoly(gca, [verts(1,:); verts(length(verts), :); 1,x; verts(1),x]);
api = iptgetapi(h);
api.setColor('red');
saveas(fig, 'test.jpg');
close all;
10
solved how to find the black region in near the edge