我正在尝试将下面的图像自动裁剪到边界框。背景将始终是相同的颜色。我试过了答案 Find the edges of image and crop it in MATLAB 和Mathworks上的各种应用程序和示例文件交换,但我被困在获得一个合适的边界框。
我正在考虑将图像转换为黑白图像,将其转换为二进制图形并删除所有接近白色而不是黑色的图像,但我不确定如何去处理它。
答案 0 :(得分:4)
这是一个很好的方式
img = im2double(imread('http://i.stack.imgur.com/ZuiEt.jpg')); % read image and convert it to double in range [0..1]
b = sum( (1-img).^2, 3 ); % check how far each pixel from "white"
% display
figure; imshow( b > .5 ); title('non background pixels');
% use regionprops to get the bounding box
st = regionprops( double( b > .5 ), 'BoundingBox' ); % convert to double to avoid bwlabel of logical input
rect = st.BoundingBox; % get the bounding box
% display
figure; imshow( img );
hold on; rectangle('Position', rect );
关注Jak's request,这是解释的第二行
将img
转换为double
类型后(使用im2double
),图片将作为h
存储在内存中 - by - w
- by-3 double
类型的矩阵。每个像素有3个值,介于0和1之间(不是255!),表示其RGB值为0,黑色为1,亮度为1
因此,(1-img).^2
检查每个像素和每个通道(RGB)与1的距离 - 亮度。像素越暗 - 距离越大。
接下来,我们使用sum( . ,3 )
命令将每个通道的距离与每个像素的单个值相加,得到h
- 每个像素与白色的距离的w
二维矩阵。
最后,假设背景为亮白色,我们选择远离明亮b > .5
的所有像素。这个阈值并不完美,但它可以很好地捕捉到物体的边界。
答案 1 :(得分:3)
根据Shai的答案,我提出了一种方法,可以根据黑白图像上的find
来规避regionprops(图像处理工具箱)。
% load
img = im2double(imread('http://i.stack.imgur.com/ZuiEt.jpg'));
% black-white image by threshold on check how far each pixel from "white"
bw = sum((1-img).^2, 3) > .5;
% show bw image
figure; imshow(bw); title('bw image');
% get bounding box (first row, first column, number rows, number columns)
[row, col] = find(bw);
bounding_box = [min(row), min(col), max(row) - min(row) + 1, max(col) - min(col) + 1];
% display with rectangle
rect = bounding_box([2,1,4,3]); % rectangle wants x,y,w,h we have rows, columns, ... need to convert
figure; imshow(img); hold on; rectangle('Position', rect);
答案 2 :(得分:0)
裁剪图像 首先创建要裁剪的边框。
crp = imcrop(original_image_name,boundry_box);
我在我的任务中这样做了。这真的有效!!!!!!