2016-11-02 2 views
3

Я здесь новый. У меня есть несколько изображений диком.dicom images min max пикселей и местоположений

  1. Мне нужно получить значение пикселей 4 Макс и их координату всех изображений
  2. и автоматически обрезать 128 от 128 4 заплаты от каждого изображения сохраняя центральный пиксель один из максимального пикселя, который был найдено
  3. сохранить патчи

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

Я сделал этот код для одного изображения, но это не дает мне правильный ответ:

sortedValues = sort(grayImage, 'descend'); 
% Get the 4 max values and their coords 
for k = 1 : 4 
    thisValue = sortedValues(k); 
    % Find where it occurs 
    [rows, columns] = find(grayImage, thisValue); 
    % Plot them over the image 
    for k2 = 1 : length(rows) 
     thisRow = rows(k2); 
     thisColumn = columns(k2); 
     plot(thisColumn, thisRow, 'r+'); 
     hold on; 
     text(thisColumn, thisRow, num2str(k)); 
     % Crop into a new image 
     row1 = thisRow - 64; 
     row2 = row1 + 127; 
     col1 = thisColumn - 64; 
     col2 = col1 + 127; 
     subImage = grayImage(row1:row2, col1:col2); 
     % Now do something with subimage.... 
    end 
end 

Пожалуйста, помогите мне.

+2

Попробуйте добавить образец изображения и покажет, какой ответ вы получите и почему это неправильно. –

ответ

0

Вы можете сделать это, как это в bash с vips и ImageMagick

#!/bin/bash 
# Convert DICOM image to PNG for vips 
convert image.dcm image.png 

# Use vips to get x and y of 4 maximum pixel locations 
{ read line; read -a x <<< "$line" 
    read line; read -a y <<< "$line" 
    read line; } < <(vips im_maxpos_vec image.png 4) 

# Now crop them out as centres of 128x128 boxes 
i=0 
for index in "${!x[@]}"; do 
    cx=${x[index]} 
    cy=${y[index]} 
    ((a=cx-64)) 
    ((b=cy-64)) 
    echo Cropping from $cx,$cy to sub-${i}.png 
    convert image.png -crop 128x128+${cx}+${cy} +repage sub-${i}.png 
    ((i=i+1)) 
done 

я, вероятно, может устранить потребность в vips в случае необходимости.

+0

Я использую matlab, plz вы можете рассказать, что такое bash, vips, ImageMagic? – user2102092

+1

Они представляют собой набор чрезвычайно мощных, чрезвычайно гибких, бесплатных инструментов для обработки изображений с открытым исходным кодом, но не беспокойтесь, если вы их не знаете - просто пометьте свой вопрос «Matlab», и я уверен, что кто-то еще поможет вам вне. –

2

Следуя вашему коду, вот самый простой способ сделать это. Обратите внимание, что я сделал некоторые исправления и улучшения по пути:

imshow(grayImage); 
hold on; % only needed once 

% corrected to sort the entire image grayImage(:), not just column-by-column 
% sortedValues not used here, but left for future use 
[sortedValues, sortedIndices] = sort(grayImage(:), 'descend'); 

for k = 1:4 
    [m,n] = size(grayImage); 
    [r,c] = ind2sub([m,n], sortedIndices(k)); 
    plot(c, r, 'r+'); 
    text(c, r, num2str(k)); 
    row1 = max(r - 64, 1); % make sure rows/columns don't fall outside image 
    row2 = min(r + 63, m); 
    col1 = max(c - 64, 1); 
    col2 = min(c + 63, n); 
    subImage = grayImage(row1:row2, col1:col2); 
    % Now do something with subimage... 
end 

hold off; 

Это использует второй выход sort, чтобы получить индексы максимальных пикселей, а затем передает эти показатели через ind2sub, чтобы получить строку/номер столбца ,