Отличие изображений в MATLAB

У меня есть два изображения, которые нужно объединить. Изображения АБ

Я их слил и получил вот это изображение слилось Теперь мне нужна разница между слитым изображением F и изображением B. Я выполнил код, но не получил желаемых результатов

Я получаю это изображение -> разница нормализованная разница, Но я хочу это -> Обязательно

Значения разностного изображения нормированы в диапазоне от 0 до 1.

Используемый код

difference=F-B;
figure,imshow(difference);
normImage = mat2gray(difference);
figure,imshow(normImage);

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

Как вы соединяете образы? Основываясь на опубликованных вами изображениях, вы вычитаете изображения uint8, поэтому все отрицательные значения фиксируются до 0.

beaker 27.12.2022 17:37

У меня есть два исходных изображения, которые частично размыты. Часть размытия на одном изображении четкая на другом изображении и наоборот. Затем применяется метод, основанный на слиянии изображений, и создается объединенное изображение. Совмещенное изображение — это полностью сфокусированное изображение.

925678 27.12.2022 17:40

Ладно, ничего страшного, если ты не хочешь мне говорить. Итак, у нас есть два изображения: одно 3-канальное изображение uint8 размером 214x214x3, и вы вычитаете 1-канальное изображение uint8 512x512, и даже если вы можете вычесть эти два массива друг из друга, вы потеряете данные. поскольку, как я сказал выше, вы не можете представлять отрицательные значения в выбранных вами типах массивов. Я не понимаю, как это будет работать.

beaker 27.12.2022 17:49

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

925678 27.12.2022 17:57

А также, Все изображения имеют одинаковый размер 512*512. Если размеры разные, то процесс слияния не произойдет.

925678 27.12.2022 18:04

Вы ничего не сказали мне о процессе синтеза, что могло бы дать мне какую-либо новую информацию о ваших вкладах, но, как я уже сказал, это нормально. Теперь мой единственный источник данных, который поможет вам решить вашу проблему, - это то, что вы разместили в своем вопросе. Как вы говорите, попытка вычесть массив 512x512x1 из массива 214x214x3 потерпит неудачу, но это то, что вы указали в своем вопросе. Чтобы не отвлекать вас, я задам важный вопрос в следующем комментарии.

beaker 27.12.2022 18:05

Вычитание целочисленных изображений без знака дает вам целочисленное изображение без знака. Отрицательные значения фиксируются на 0 в MATLAB. Сначала вам нужно преобразовать изображения в двойники. Используйте im2double. Затем при отображении убедитесь, что отображается правильный диапазон интенсивностей, например, с помощью imshow(img,[]), чтобы минимальное значение в изображении было сопоставлено с черным, а максимальное — с белым.

Cris Luengo 27.12.2022 18:05

Два изображения F и B относятся к типу uint8? Если это так, то ваши результаты не будут такими, как вы ожидаете.

beaker 27.12.2022 18:06

@beaker, сэр, как я уже сказал, все изображения имеют одинаковый размер 512 * 512. Нет изображения 214*214*3. Все изображения представляют собой изображения в градациях серого, т.е. 1-канальное изображение. Трехканального изображения нет. YEs Sir, A, B, F все три типа uint8. Все три 512*512*1

925678 27.12.2022 18:15

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

beaker 27.12.2022 18:28

@CrisLuengo, сэр, я использовал im2double, но все равно получаю тот же результат, что и в теге «требуется».

925678 27.12.2022 18:40

@beaker Сэр, я разместил все исходные изображения и объединенное изображение. Что еще я должен опубликовать? Либо вы хотите больше кода (код для процесса слияния)? Так как я взял код с github. Так что, если вам нужна ссылка, я могу ее предоставить, но публиковать чужой код против правил. Должен ли я поделиться ссылкой на github или любой документ для справки?

925678 27.12.2022 18:42

Именно в этом проблема. Исходные изображения и объединенное изображение, которое вы разместили, имеют разные размеры.

beaker 27.12.2022 18:45

@beaker Сэр, теперь я добавил все изображения одинакового размера. Пожалуйста, проверь это. Изображение под тегом «обязательный» — это снимок экрана, сделанный с бумаги, чтобы я мог показать вам, какой тип изображения я хочу. Если вы хотите увидеть эти изображения на бумаге, я могу поделиться ссылкой.

925678 27.12.2022 19:26
Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
1
14
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С использованием:

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 в результате разницы.

925678 28.12.2022 07:09

Сэр, хорошее объяснение. Я сделаю это и на своем конце. Спасибо.

925678 30.12.2022 14:32

Другие вопросы по теме