У меня есть два изображения, которые нужно объединить. Изображения АБ
Я их слил и получил вот это изображение слилось Теперь мне нужна разница между слитым изображением F и изображением B. Я выполнил код, но не получил желаемых результатов
Я получаю это изображение -> разница нормализованная разница, Но я хочу это -> Обязательно
Значения разностного изображения нормированы в диапазоне от 0 до 1.
Используемый код
difference=F-B;
figure,imshow(difference);
normImage = mat2gray(difference);
figure,imshow(normImage);
Пожалуйста, помогите. Спасибо.
У меня есть два исходных изображения, которые частично размыты. Часть размытия на одном изображении четкая на другом изображении и наоборот. Затем применяется метод, основанный на слиянии изображений, и создается объединенное изображение. Совмещенное изображение — это полностью сфокусированное изображение.
Ладно, ничего страшного, если ты не хочешь мне говорить. Итак, у нас есть два изображения: одно 3-канальное изображение uint8 размером 214x214x3, и вы вычитаете 1-канальное изображение uint8 512x512, и даже если вы можете вычесть эти два массива друг из друга, вы потеряете данные. поскольку, как я сказал выше, вы не можете представлять отрицательные значения в выбранных вами типах массивов. Я не понимаю, как это будет работать.
Сэр, я уже говорил вам выше, как я его плавлю. Но процесс техники, используемой для слияния, слишком долгий, поэтому я дал только обзор. Сэр, следует отметить, что изображения представляют собой только одноканальные изображения. RGB-изображения нет.
А также, Все изображения имеют одинаковый размер 512*512. Если размеры разные, то процесс слияния не произойдет.
Вы ничего не сказали мне о процессе синтеза, что могло бы дать мне какую-либо новую информацию о ваших вкладах, но, как я уже сказал, это нормально. Теперь мой единственный источник данных, который поможет вам решить вашу проблему, - это то, что вы разместили в своем вопросе. Как вы говорите, попытка вычесть массив 512x512x1 из массива 214x214x3 потерпит неудачу, но это то, что вы указали в своем вопросе. Чтобы не отвлекать вас, я задам важный вопрос в следующем комментарии.
Вычитание целочисленных изображений без знака дает вам целочисленное изображение без знака. Отрицательные значения фиксируются на 0 в MATLAB. Сначала вам нужно преобразовать изображения в двойники. Используйте im2double
. Затем при отображении убедитесь, что отображается правильный диапазон интенсивностей, например, с помощью imshow(img,[])
, чтобы минимальное значение в изображении было сопоставлено с черным, а максимальное — с белым.
Два изображения F
и B
относятся к типу uint8
? Если это так, то ваши результаты не будут такими, как вы ожидаете.
@beaker, сэр, как я уже сказал, все изображения имеют одинаковый размер 512 * 512. Нет изображения 214*214*3. Все изображения представляют собой изображения в градациях серого, т.е. 1-канальное изображение. Трехканального изображения нет. YEs Sir, A, B, F все три типа uint8. Все три 512*512*1
В этом случае было бы очень полезно, если бы вы разместили эти изображения на свой вопрос, потому что это не то, что у вас есть прямо сейчас. Если ваш процесс слияния правильный, то приведение ваших изображений к удвоению и масштабированию даст вам желаемый результат. Однако я немного обеспокоен тем, что вы также использовали целые числа без знака для объединения изображений и что эти результаты также недействительны.
@CrisLuengo, сэр, я использовал im2double, но все равно получаю тот же результат, что и в теге «требуется».
@beaker Сэр, я разместил все исходные изображения и объединенное изображение. Что еще я должен опубликовать? Либо вы хотите больше кода (код для процесса слияния)? Так как я взял код с github. Так что, если вам нужна ссылка, я могу ее предоставить, но публиковать чужой код против правил. Должен ли я поделиться ссылкой на github или любой документ для справки?
Именно в этом проблема. Исходные изображения и объединенное изображение, которое вы разместили, имеют разные размеры.
@beaker Сэр, теперь я добавил все изображения одинакового размера. Пожалуйста, проверь это. Изображение под тегом «обязательный» — это снимок экрана, сделанный с бумаги, чтобы я мог показать вам, какой тип изображения я хочу. Если вы хотите увидеть эти изображения на бумаге, я могу поделиться ссылкой.
С использованием:
R = mat2gray(im2double(F)-im2double(B));
Мой результат:
Чтобы понять, почему преобразование в двойное значение важно, посмотрите на область изображения, где есть B(y,x) > F(y,x)
, например, (343, 280)
в ваших образцах изображений.
>> F(343,280)
ans = 32
>> B(343,280)
ans = 107
Математически мы ожидаем, что 32-107 будет равно -75, но:
>> F(343,280) - B(343,280)
ans = 0
Это потому, что и F
, и B
являются массивами uint8
:
>> class(F)
ans = uint8
>> class(B)
ans = uint8
Как целое число без знака, uint8 не может принимать отрицательное значение, поэтому любая попытка присвоить отрицательное значение переменной uint8 приводит к 0. Поскольку оба операнда — uint8, результатом будет uint8. Попытка преобразовать это значение в двойное значение после того, как оно уже было зажато в диапазоне 0-255, просто приведет к созданию двойной переменной со значением 0. (То же самое происходит и в верхнем конце диапазона. , Попробуйте uint8(444)
.)
Приведение F
и B
к знаковому типу (достаточно большому диапазону от -max до +max или в данном случае от -255 до 255) решит математическую задачу:
>> int16(F(343,280)) - int16(B(343,280))
ans = -75
Однако для изображений приведение к double
кажется более естественным и дает вам большую точность, чем целые числа, когда вы выполняете вычисления и масштабирование. Кроме того, мы можем использовать эту удобную функцию im2double
, которая не только приводит массив к удвоению, но и масштабирует все, чтобы оно было между 0 и 1:
>> Fd = im2double(F);
>> Fd(343,280)
ans = 0.1255 % 32.0/255.0
>> Bd = im2double(B);
>> Bd(343,280)
ans = 0.4196 % 107.0/255.0
Но теперь, когда мы пытаемся вычесть два, мы на самом деле получаем отрицательное значение, как и ожидалось:
>> Fd(343,280) - Bd(343,280)
ans = -0.2941 % -75.0/255.0
Итак, im2double(F)-im2double(B)
дает нам двойные значения между -1,0 и 1,0. mat2gray
заботится о масштабировании этих значений до диапазона от 0,0 до 1,0 для отображения.
Примечание: я выбрал координаты (343 280) очень тщательно, потому что именно там F-B наиболее отрицательна. Если вам интересно, как происходит преобразование и какие значения к чему масштабируются, вы также можете взглянуть на (53,266).
Сэр, большое спасибо. Оно работает. На самом деле я сначала узнаю разницу, а затем пишу im2double(difference). Но сэр, какое это имеет значение. Вы берете разницу, используя im2double, а я использую im2double в результате разницы.
Сэр, хорошее объяснение. Я сделаю это и на своем конце. Спасибо.
Как вы соединяете образы? Основываясь на опубликованных вами изображениях, вы вычитаете изображения uint8, поэтому все отрицательные значения фиксируются до 0.