Уменьшить целевой контраст без потери деталей изображения - PullRequest
1 голос
/ 23 октября 2019

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

Другими словами, есть ли способ добавить непрозрачность к изображению слева, чтобы имитировать изображение справа? Была предоставлена ​​маска объекта, и она имеет тот же размер, что и исходное изображение.

Любое предложение будет оценено.

1 Ответ

0 голосов
/ 24 октября 2019

Вы уменьшаете контрастность путем умножения маскированной области на входном изображении:

I = imread('https://i.stack.imgur.com/QML1p.png'); %I = imread('1.png'); %Read image
M = imbinarize(imread('https://i.stack.imgur.com/nBqeS.png')); %imbinarize(imread('2.png')); %Read mask, and convert to binary image.

J = I;
J(M) = J(M)*.5; %Multiply the "horizontal shape thing" by 0.5 - reducing contrast.

figure;imshow(J);

Результат:
enter image description here

Приведенное выше решениевид установки непрозрачности «фигуры».


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

I = imread('https://i.stack.imgur.com/QML1p.png'); 
%I = imread('1.png'); %Read image
M = imbinarize(imread('https://i.stack.imgur.com/nBqeS.png')); 
%M = imbinarize(imread('2.png')); %Read mask, and convert to binary image.

M = imdilate(M, strel('disk', 20)); %Make mask thicker.

%Crate blurred "shape thing"
T = zeros(size(I));
T(M) = double(I(M)); %"shape thing" with some margins, and black surrounding.
T = T/255; %Change pixels range from [0, 255] to [0, 1].
T = imgaussfilt(double(T), 5); %Blur (2-D Gaussian filtering).

%Create blurred mask:
M = imgaussfilt(double(M), 20); %Blur the mask (2-D Gaussian filtering).
M = max(M, 0.5);

J = T.*M + im2double(I).*(1-M); %Weighed average.
J = imgaussfilt(J, 1);
J = im2uint8(J);

figure;imshow(J);

Результат:
enter image description here

Попробуйте поиграть с ним немного ...


Еще одна попытка:

  • Уменьшить относительный контраст между "фигуркой" и фоном путем усреднения J и 0,5
  • Добавить гауссов шум (поэтому результат будет ближе к эталонному).

Код:

I = imread('https://i.stack.imgur.com/QML1p.png'); 
M = imbinarize(imread('https://i.stack.imgur.com/nBqeS.png')); 

M = imdilate(M, strel('disk', 20)); %Make mask thicker.

%Crate blurred "shape thing"
T = zeros(size(I));
T(M) = double(I(M)); %"shape thing" with some margins, and black surrounding.
T = T/255; %Change pixels range from [0, 255] to [0, 1].
T = imgaussfilt(double(T), 5); %Blur (2-D Gaussian filtering).

T = T*1.5; %Scale T for changing opaquely

%Create blurred mask:
M = imgaussfilt(double(M), 20); %Blur the mask (2-D Gaussian filtering).
M = max(M, 0.5);

J = T.*M + im2double(I).*(1-M); %Weighed average.
J = imgaussfilt(J, 1);

%Reduce the relative contrast between "shape thing" and background by averaging J and 0.5
J = (J + 0.5)/2;
J = min(J, 1);

%Add gaussian noise (so result be closer to reference). 
J = imnoise(J, 'gaussian', 0, 0.005);

J = im2uint8(J);

figure;imshow(J);

Результат:
enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...