2014-11-28 2 views

ответ

1

Давайте решать одну функцию в то время:

cv2.threshold

Ближайшим эквивалентом будет использовать im2bw. Этот порог создает изображение, основанное на указанном вами уровне интенсивности. Однако то, что отличается от im2bw по сравнению с cv2.threshold, заключается в том, что вы не можете указать, какое значение порогового значения будет. im2bw предполагает, что это двоичный код 1. Таким образом, если вы хотите преобразовать это в другое значение, вам нужно будет отобразить изображение до uint8 (или любого другого типа данных вашего изображения), а затем установить любые местоположения, которые равны 1 к какой бы стоимости вы ни пожелали. Таким образом, предполагается, что вашим образом будет загружено в с imread и изображением называется im, level является пороговым уровнем вы хотите порог при и maxval является конечным значением выходного вы хотите, чтобы каждый пороговый пиксель взять, вы могли бы сделать:

out = im2bw(im, level/255); 
out = uint8(out); 
out(out == 1) = maxval; 

Важно отметить, что пороговый уровень нормализован между [0,1]. Я разделил на 255, так как большинство изображений uint8, и поэтому деление на 255 приведет к диапазону [0,1]. cv2.threshold также имеет пороговое значение через Otsu. Вы можете сделать это в MATLAB через graythresh. graythresh обеспечит оптимальный порог между [0,1], который вы можете ввести непосредственно в im2bw. Поэтому:

out = im2bw(im, graythresh(im)); 
out = uint8(out); 
out(out == 1) = maxval; 

cv2.inRange

Эта функция не поддерживается изначально в среде MATLAB. То, что вам нужно сделать, это взять каждую плоскость вашего изображения (только один для оттенков серого, три для цвета) и индивидуально проверить, есть ли пиксели, находящиеся в допустимых диапазонах. Если есть, вы должны установить это в логическое значение true. Таким образом, для черно-белых изображений, вы могли бы сделать что-то вроде:

minval = ...; %// Define minimum value here 
maxval = ...; %// Define maximum value here 

out = (im >= minval & im <= maxval); 

Для цветных изображений, вы могли бы сделать что-то вроде:

minval = ...; %// Define three element vector here for each colour plane i.e. [0 128 128]; 
maxval = ...; %// Define three element vector here for each colour plane i.e. [0 128 128]; 

out = true(size(im,1), size(im,2)); 
for p = 1 : 3 
    out = out & (im(:,:,p) >= minval(p) & im(:,:,p) <= maxval(p)); 
end 

Что мы делаем здесь собирается самолет на самолете и проверки, посмотрите, находится ли каждая цветовая плоскость в пределах диапазона, указанного для каждого элемента, в minval и maxval. Как только мы найдем пиксель, который находится за пределами диапазона для любой цветовой плоскости, мы установили бы это место на false.


Удачи вам!

+0

Да! это ответ очень хорошо объяснен. Я также думал, что нет эквивалента функции MATLAB. Нужно изменить их или играть с индексами. Большое спасибо за ваш ответ ! – Maham

+1

@Maham - Добро пожаловать :) В этом вопросе есть Python, OpenCV и MATLAB все в одном. Я не мог удержаться от ответа! – rayryeng

+0

@Maham - У меня были небольшие опечатки в моем посте. Проверьте мои изменения. – rayryeng

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