Этот код работает для меня, предполагая, что ваши пиксели с черной рамкой все равны нулю. Если в черных границах вашего изображения есть ненулевые пиксели (вероятно, из-за артефактов квантования и сжатия - ваше изображение все-таки JPEG...), тогда этот код не будет работать. Что делает этот код, так это сначала проверяет все столбцы, чтобы увидеть, есть ли какие-либо ненулевые пиксели. Затем он выясняет, где обрезать, определяя первый ненулевой столбец и переходя к последнему ненулевому столбцу. Этот код также предполагает, что ненулевые столбцы являются симметричными, поэтому вы делите на 2 в своем выражении zeros
. Кстати, zeros
— это встроенная функция MATLAB. Я не рекомендую вам создавать переменную с таким именем, так как ваш более поздний код может потребовать эту функцию, и вы непреднамеренно затеняете эту функцию с помощью переменной.
Тем не менее, вот что я сделал, чтобы проверить, работает ли ваш код. Я использовал встроенное изображение из системного пути MATLAB cameraman.tif
и создал 10-пиксельную рамку, окружающую изображение. Затем я запустил ваш код, чтобы посмотреть, что я получу:
im = imread('cameraman.tif');
I1 = padarray(im2double(im), [10 10]);
Запустив ваш код, я получаю следующую цифру:
![введите здесь описание изображения](https://i.stack.imgur.com/jlSk1.png)
При запуске этого кода существуют определенные предварительные условия, поэтому имейте это в виду, прежде чем использовать его:
- Это предполагает полностью симметричную черную рамку вокруг изображения.
- Это предполагает, что все пиксели черной границы равны нулю.
- Если ваша граница имеет ненулевые пиксели, даже если она визуально может выглядеть так, как будто это ненулевые пиксели, этот код не будет работать.
Таким образом, я предлагаю вам установить небольшое пороговое значение вашего изображения (возможно, интенсивность 10), чтобы убедиться, что границы равны нулю, прежде чем продолжить. Затем вы должны использовать это изображение, чтобы вычислить, сколько у вас граничных пикселей. Таким образом, сделайте что-то вроде этого.
I1=im2double(imread('dart.jpg')); %// Read in the image
I1thresh = I1 >= (10/255); %// As an example - Note the division by 255 as you did im2double
sizeI = size(I1);
zeros = floor((sizeI(2) - min(sum(any(I1thresh))))/2); %// Note the change in any
I2 = I1(:, zeros : sizeI(2)-zeros, :);
I2thresh = I1thresh(:, zeros : sizeI(2)-zeros, :); % // Note new variable
nonZero = sum(any(I1thresh,2)); %// Note the change in any
sizeI2 = size(I2);
zerosRows = floor((sizeI(1) - min(sum(any(I2thresh, 2))))/2); %// Note change in any
I3 = I2(zerosRows : sizeI2(1)-zerosRows, :, :);
subplot(1,3,1), imshow(I1);title('Figure 1');
subplot(1,3,2), imshow(I2);title('Figure 2');
subplot(1,3,3), imshow(I3);title('Figure 3');
Редактировать - неравномерные черные границы
Из ваших комментариев вы сказали, что ваши черные границы могут быть несимметричными. В этом случае у вас должна быть логика, которая определяет начало черной границы и ее конец. Вы применяете это как к строкам, так и к столбцам черных границ. В этом случае я бы использовал команду find
и any
операции по строкам и столбцам и определить наименьший и наибольший индексы, где строки и столбцы не равны нулю. Это точно соответствует минимальным и максимальным операциям в MATLAB по отношению к вашему коду. Я собираюсь использовать модифицированный алгоритм с пороговой обработкой, чтобы обойти любые артефакты квантования или сжатия. Как таковой:
I1=im2double(imread('dart.jpg')); %// Read in the image
I1thresh = I1 >= (10/255); %// As an example - Note the division by 255 as you did im2double
%// Removed as this is no longer needed
%// sizeI = size(I1);
nonZeroCols = find(any(I1thresh)); %// Change
minCol = min(nonZeroCols); %// Change
maxCol = max(nonZeroCols); %// Change
I2 = I1(:, minCol : maxCol, :);
I2thresh = I1thresh(:, minCol : maxCol, :); % // Note new variable
%// Commented out. Don't see this being used anywhere
%//nonZero = sum(any(I1thresh,2)); %// Note the change in any
%// Removed as this is no longer needed
%//sizeI2 = size(I2);
nonZeroRows = find(any(I2thresh, 2)); %// Change
minRow = min(nonZeroRows); %// Change
maxRow = max(nonZeroRows); %// Change
I3 = I2(minRow : maxRow, :, :); %// Change
subplot(1,3,1), imshow(I1);title('Figure 1');
subplot(1,3,2), imshow(I2);title('Figure 2');
subplot(1,3,3), imshow(I3);title('Figure 3');
Приведенный выше код теперь должен работать для черной рамки любого размера.
person
rayryeng
schedule
30.08.2014