Matlab-улучшение кода при обрезке изображения с черной рамкой

У меня есть этот код, который обрезает черные рамки на моем изображении.

Я не знаю, почему граница все еще существует.

I1=im2double(imread('dart.jpg'));

sizeI = size(I1);
zeros = floor((sizeI(2) -  min(sum(any(I1))))/2);
I2 = I1(:, zeros : sizeI(2)-zeros, :);
nonZero = sum(any(I1,2));


sizeI2 = size(I2);
zerosRows = floor((sizeI(1) -  min(sum(any(I2, 2))))/2);
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');

Как я могу изменить этот код?


person SEBASTIAN LOTuS    schedule 30.08.2014    source источник


Ответы (1)


Этот код работает для меня, предполагая, что ваши пиксели с черной рамкой все равны нулю. Если в черных границах вашего изображения есть ненулевые пиксели (вероятно, из-за артефактов квантования и сжатия - ваше изображение все-таки JPEG...), тогда этот код не будет работать. Что делает этот код, так это сначала проверяет все столбцы, чтобы увидеть, есть ли какие-либо ненулевые пиксели. Затем он выясняет, где обрезать, определяя первый ненулевой столбец и переходя к последнему ненулевому столбцу. Этот код также предполагает, что ненулевые столбцы являются симметричными, поэтому вы делите на 2 в своем выражении zeros. Кстати, zeros — это встроенная функция MATLAB. Я не рекомендую вам создавать переменную с таким именем, так как ваш более поздний код может потребовать эту функцию, и вы непреднамеренно затеняете эту функцию с помощью переменной.

Тем не менее, вот что я сделал, чтобы проверить, работает ли ваш код. Я использовал встроенное изображение из системного пути MATLAB cameraman.tif и создал 10-пиксельную рамку, окружающую изображение. Затем я запустил ваш код, чтобы посмотреть, что я получу:

im = imread('cameraman.tif');
I1 = padarray(im2double(im), [10 10]);

Запустив ваш код, я получаю следующую цифру:

введите здесь описание изображения


При запуске этого кода существуют определенные предварительные условия, поэтому имейте это в виду, прежде чем использовать его:

  1. Это предполагает полностью симметричную черную рамку вокруг изображения.
  2. Это предполагает, что все пиксели черной границы равны нулю.
  3. Если ваша граница имеет ненулевые пиксели, даже если она визуально может выглядеть так, как будто это ненулевые пиксели, этот код не будет работать.

Таким образом, я предлагаю вам установить небольшое пороговое значение вашего изображения (возможно, интенсивность 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
comment
дорогой друг :) я знаю, что делает этот код .. я думаю, проблема в том, что на моей картинке черные границы не симметричны, как я могу это изменить - person SEBASTIAN LOTuS; 31.08.2014
comment
@SEBASTIANLOTuS - Вам нужна еще помощь? - person rayryeng; 03.09.2014
comment
Пожалуйста, как я могу обновить этот код, чтобы применить его к моему граничному содержимому с ненулевыми пикселями - person zenab; 09.12.2014
comment
@zenab - я понятия не имею, что ты только что сказал. Просьба уточнить. - person rayryeng; 09.12.2014
comment
@rayryeng- Я хотел бы сообщить вам, что рамка моего изображения не черная, и я хочу сказать, что ваш код плохо работает с моими музейными изображениями RGB, т. Е. Он не удалил границу изображения .. спасибо - person zenab; 10.12.2014
comment
@zenab Э-э .... Конечно, граница не удаляется, если она не черная. Этот код предполагает, что граница черная. Вы используете этот код так, как я изначально не планировал... И с этим вы предоставлены сами себе. Удачи! - person rayryeng; 10.12.2014
comment
@rayryeng... Хорошо, спасибо... Сейчас я пытаюсь решить свою проблему - person zenab; 10.12.2014