2013-12-03 1 views
4

У меня серое изображение размером 400 x 600. И я хочу выбрать случайно с этого изображения, патч размером 50 х 50.Выберите случайный патч из изображения с помощью matlab

Кстати, я попытался написать код для этого, и он отлично работал. Но согласно моему коду ниже, есть еще одно решение? Другими словами, есть ли другой код, который может быть более сексуальным, чем мой собственный код?

clear all; 
close all; 
clc; 

image=imread('my_image.jpg'); 
image_gray=rgb2gray(image); 
[n m]= size(image_gray); % 400 x600 

L=50; 

x=round(rand(1)*n); % generate a random integer between 1 and 400 
y=round(rand(1)*m); % generate a random integer between 1 and 600 

%verify if x is > than 400-50 , because if x is equal to 380 for example, so x+50 become %equal to 430, it exceeds the matrix dimension of image... 
if(x<=n-L) 
a=x:x+(L-1); 
else 
a=x-(L-1):x; 
end 

if(y<=m-L) 
b=y:y+(L-1); 
else 
b=y-(L-1):y; 
end 

crop=image_gray(a,b); 
figure(1); 
imshow(crop); 
+4

Вы хотите, чтобы ваш код был более «сексуальным» ??? Я программировал с помощью Matlab довольно долгое время, и я никогда не сталкивался с «сексуальным» кодом ... Я настоятельно рекомендую вам найти себя «значительным другим» и провести некоторое время далеко от компиляторов и экранов. – Shai

+0

desolee, я отредактировал мой вопрос – Christina

+1

@Чристина Почему? Так было смешно. И теперь исходное предложение в моем ответе выглядит глупо :-) –

ответ

14

Это как «сексуальный», как он получает. Гарантированное ;-)

% Data 
img=imread('my_image.jpg'); 
image_gray=rgb2gray(img); 
[n m]= size(image_gray); 
L = 50; 

% Crop 
crop = image_gray(randi(n-L+1)+(0:L-1),randi(m-L+1)+(0:L-1)); 

При использовании версии Matlab, которая не поддерживает randi, заменить последнюю строку на

crop = image_gray(ceil(rand*(n-L+1))+(0:L-1),ceil(rand*(m-L+1))+(0:L-1)); 

Комментариев к вашей коде:

  • Вы не должны используйте имя image. Он переопределяет функцию.
  • Вы должны изменить round(rand(1)*n) на ceil(rand(1)*n). Или используйте randi(n).
  • Вместо randi(n), используйте randi(n-L+1). Таким образом, вы избегаете if.
+0

Я только что получил сообщение с кодом: Index превышает размеры матрицы. –

+0

Я проверяю ваши значения диапазона, это не прерывается каждый раз, но некоторые значения индекса выходят за допустимые пределы. –

+0

Дайте мне минуту, я снова проверю значения. –

0

Для тех, кто пытается получить этот код для работы с изображениями RGB, при вычислении размера вы захотите добавить дополнительную переменную для третьего измерения. то есть

% Data 
img=imread('my_image.jpg'); 
% Not making anything gray anymore 
[n, m, ~]= size(img); 
L = 50; 

% Crop - add a : in order to get 3 or more dimensions at the end 
crop = img(randi(n-L+1)+(0:L-1),randi(m-L+1)+(0:L-1), :); 

Супер простой, но не обязательно очевидный вначале.

Смежные вопросы