Как отобразить изображение в градациях серого, используя границу, определенную в другом бинарном изображении

У меня есть исходное изображение в градациях серого (я использую изображение маммограммы с метками вне изображения). Мне нужно удалить некоторые объекты (метки) в этом изображении, поэтому я преобразовал это изображение в градациях серого в двоичное изображение. Затем я следовал методу ответа, указанному в Как выбрать объект с наибольшим площадь

Наконец, я извлек объект с наибольшей площадью в виде двоичного изображения. Я хочу, чтобы эта область была в оттенках серого для доступа и сегментации небольших объектов внутри нее. Например. Мелкие ткани в области и также должны определять ее края.

Извлеченное двоичное изображениеИсходное изображение в оттенках серого

**

Как я могу получить эту выделенную область объекта в виде изображения в градациях серого или в любом случае получить самую большую область объекта из градаций серого напрямую, без преобразования в двоичный или каким-либо другим способом?

**

(Я новичок в Matlab. Я не знаю, правильно ли я это объяснил. Если вы не можете получить, я предоставлю более подробную информацию)


person Cholavendhan    schedule 08.04.2014    source источник


Ответы (2)


Если я правильно вас понял, вы хотите получить серое изображение с выделенным только самым большим пятном.

Код

img = imread(IMAGE_FILEPATH);
BW = im2bw(img,0.2); %%// 0.2 worked to get a good area for the biggest blob

%%// Biggest blob
[L, num] = bwlabel(BW);
counts = sum(bsxfun(@eq,L(:),1:num));
[~,ind] = max(counts);
BW = (L==ind);

%%// Close the biggest blob
[L,num] = bwlabel( ~BW );
counts = sum(bsxfun(@eq,L(:),1:num));
[~,ind] = max(counts);
BW = ~(L==ind);

%%// Original image with only the biggest blob highlighted
img1 = uint8(255.*bsxfun(@times,im2double(img),BW));

%%// Display input and output images
figure,
subplot(121),imshow(img)
subplot(122),imshow(img1)

Вывод

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

person Divakar    schedule 09.04.2014

Если я правильно понимаю ваш вопрос, вы хотите использовать бинарную карту и получить доступ к соответствующей интенсивности пикселей в этих регионах.

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

Вот пример кода, с которым вы можете поиграть.

% Assumptions:
% im - Original image
% bmap - Binary image 

% Where the output image will be stored
outImg = uint8(zeros(size(im)));

% Find locations in the binary image that are white
locWhite = find(bmap == 1);

% Copy over the intensity values from these locations from
% the original image to the output image.
% The output image will only contain those pixels that were white
% in the binary image
outImg(locWhite) = im(locWhite);

% Show the original and the result side by side
figure;
subplot(1,2,1);
imshow(im); title('Original Image');
subplot(1,2,2);
imshow(outImg); title('Extracted Result');

Дайте мне знать, если это то, что вы ищете.

Способ №2

Как предложил Рафаэль в своих комментариях, вы можете вообще не использовать find и использовать логические операторы:

outImg = img; 
outImg(~bmap) = 0;

Я решил использовать find, так как он менее запутан для новичка, хотя и менее эффективен. Любой метод даст вам правильный результат.


Немного пищи для размышлений

Извлеченная область, которую вы имеете в своем двоичном изображении, имеет несколько отверстий. Я подозреваю, что вы захотите захватить весь регион без каких-либо дыр. Таким образом, я бы порекомендовал вам заполнить эти пробелы, прежде чем использовать приведенный выше код. Функция imfill из MATLAB прекрасно работает и принимает на вход бинарные изображения.

Ознакомьтесь с документацией здесь: http://www.mathworks.com/help/images/ref/imfill.html

Таким образом, сначала примените imfill к двоичному изображению, а затем используйте приведенный выше код для извлечения.

person rayryeng    schedule 09.04.2014
comment
Вы можете сделать это напрямую, не используя find: outImg = img; outImg(~bmap) = 0; - person Rafael Monteiro; 09.04.2014
comment
Я решил использовать find, поскольку ОП заявил, что он / она новичок. Это менее запутанно (хотя и менее эффективно, я признаю) за счет использования find.... в любом случае, на мой взгляд. - person rayryeng; 09.04.2014
comment
Спасибо.. Всего 2 строчки. Но отлично справляется со своей задачей. Легко понять.. Tnk u.. - person Cholavendhan; 11.04.2014
comment
Но он не может сохранить края резко или даже ближе. Зависит от порогового значения, которое я использую для преобразования двоичного изображения. (Изначально я использовал функцию greythresh(), затем вручную использовал 0,2, как указано в ответе выше. - person Cholavendhan; 11.04.2014
comment
Я извлек пиксели выше определенной интенсивности. Но в извлеченную часть входит и правая верхняя часть тела. Я хочу только область груди. Есть ли способ обрезать или сегментировать конкретную область груди без областей тела на изображении? - person Cholavendhan; 13.04.2014
comment
Если интенсивность правой верхней части тела постоянно такая, то вы могли бы создать еще одну бинарную маску с порогом, который выше, чем у большинства интенсивностей материи груди, и достаточно высок, чтобы зафиксировать эти интенсивности для правой части тела. верхняя часть тела. После этого удалите эти части из первого бинарного изображения, созданного вами, содержащего как грудь, так и часть тела, используя это второе изображение. Это, очевидно, удалит некоторые части груди, поэтому вы можете использовать imfill, чтобы заполнить эти пробелы. - person rayryeng; 14.04.2014