2016-09-12 2 views
0

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

A) Grayscale изображения:

grayscale image

B) Чешуйчатый Изображение: scaled image

Были несколько трудностей, с которыми я столкнулся. Во-первых, масштабирование изображения не сохраняются в тех же размеров пикселя, но я могу обойти, что с помощью функции imwrite:

im = imagesc(ScaledDiff); 
imwrite(get(im,'cdata'),'scaleddiff.tif') 

Однако это приведет к потере Colorbar и палитрой. Во-вторых, даже если мне удастся уменьшить масштабированное изображение до размера изображения в градациях серого, наложение его по-прежнему является проблемой. В идеале я хотел бы установить прозрачность (или «альфа») на 0 для этих пикселей с < 0,02 при масштабированном значении изображения.

Любая идея о том, как это сделать, будет принята с благодарностью! Извините, если я не понял!


UPDATE: Благодаря Rotem, мне удалось наложить изображение в оттенках серого и определенную область моей тепловой карты:

overlay

Однако, мне нужно, чтобы отобразить Colorbar, соответствующей значения тепловой карты, поскольку в противном случае информация теряется и наложение будет бесполезным. Как мне это сделать? Ниже приведен фрагмент моего кода, где ScaledIntDiff содержит значение от 0 до 0,25, что отображается на тепловой карте:

Brightfield = imread('gray.jpg'); % read background image 
I1 = ind2rgb(gray2ind(Brightfield), gray); % convert indices into RGB scale 

scale = 1000; 
ScaledIntDiff2 = round(ScaledIntDiff.*scale); 
I2 = ind2rgb(ScaledIntDiff2, jet(256)); % this is for the heatmap 

threshold = 0.02; 
I2R = I2(:,:,1); I2G = I2(:,:,2); I2B = I2(:,:,3); 
I1R = I1(:,:,1); I1G = I1(:,:,2); I1B = I1(:,:,3); 
% Replace pixels in I2 with pixels in I1 if the value of ScaledIntDiff of those pixels is below the threshold 
I2R(ScaledIntDiff<threshold) = I1R([ScaledIntDiff<threshold]); 
I2G(ScaledIntDiff<threshold) = I1G([ScaledIntDiff<threshold]); 
I2B(ScaledIntDiff<threshold) = I1B([ScaledIntDiff<threshold]); 
I2(:,:,1) = I2R; I2(:,:,2) = I2G; I2(:,:,3) = I2B; 

figure 
imshow(I2) 

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

+0

Первая рекомендация: не используйте 'imagesc', создать RGB изображение с помощью 'ind2rgb'. Пример: 'I = imread ('cameraman.tif'); J = ind2rgb (I, parula (256)); imshow (J)'. – Rotem

+0

Если вам все еще нужно изменить размер изображения, используйте: 'imresize'. – Rotem

ответ

1

Проверьте следующее:

I = imread('CKbi2Ll.jpg'); %Load input. 

%Convert I to true color RGB image (all pixels R=G=B are gray color). 
I1 = ind2rgb(I, gray(256)); 

%Convert I to true color RGB image with color map parula (instead of using imagesc) 
I2 = ind2rgb(I, parula(256)); 

%Set the transparency (or 'alpha') to 0 for those pixels with < 0.02 in scaled image value. 
%Instead of setting transparency, replace pixels with values from I1. 
threshold = 0.02; %Set threshold to 0.02 
I2(I1 < threshold) = I1(I1 < threshold); 

%Blend I1 and I2 into J. 
alpha = 0.3; %Take 0.3 from I2 and 0.7 from I1. 
J = I2*alpha + I1*(1-alpha); 

%Display output 
imshow(J); 

enter image description here


Добавление colorbar с клещами метки от 0 до 0,25:

  • Установить цветовую карту для parula - это не влияют на отображаемое изображение, потому что формат изображения - это истинный цвет RGB.
  • Ячеистая масса добавок 6 тиков от 0 до 250.
  • Создать массив ячеек 6 TickLabels от 0 до 0.25.
  • Добавить colorbar с Ticks и TickLabels объектов недвижимости, созданных ранее.

Добавьте следующий код после imshow(J);:

colormap(parula(256)); 
TLabels = cellstr(num2str((linspace(0, 0.25, 6))')); 
T = linspace(1, 250, 6); 
colorbar('Ticks', T', 'TickLabels', TLabels); 

enter image description here


imshow('ClmypzU.jpg'); 
colormap(jet(256)); 
TLabels = cellstr(num2str((linspace(0, 0.25, 6))')); 
T = linspace(1, 250, 6); 
colorbar('Ticks', T', 'TickLabels', TLabels); 

enter image description here

+0

Спасибо! Он работает, но мне нужно отобразить цветную панель, чтобы показать значения выше (от 0 до 0,25). Любая идея о том, как это сделать? – user6101792

+0

Вы имеете в виду показывать только нижние 25% цветовой палитры 'parula' в цветной панели? – Rotem

+0

'colorbar;' 'cm = parula (256);' 'cm = cm (1:64, :);' 'colormap (cm);' – Rotem

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