повышение контрастности изображения с помощью окрестности

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

Пусть изображение рассматривается как u0. Затем я хочу улучшить изображение, используя формулу

введите здесь описание изображения

Здесь M1 — минимумы, а M2 — максимумы u0 среди соседних пикселей, Mg — максимальное значение уровня серого исходного изображения. Район, взятый для моей операции, — 9х9. uN — новое сгенерированное изображение (изображение с контрастным усилением).

Я пробовал следующий код, но не уверен, прав ли я или нет.

%Generate a contrast enhanced image
tic
clear all; close all;
I = imread('4.jpg');
I = imresize(I,[128 128]);
if size(I,3)== 3
            P = rgb2gray(uint8(I));
            P = double(P);
elseif size(I,3) == 2
            P = 0.5.*(double(I(:,:,1))+double(I(:,:,2)));
else
            P = double(I);
end
ssize=9;
mg=max(P(:));

f1 = @(x) min(x(:));
m1 = nlfilter(P,[9 9],f1);
f2 = @(x) max(x(:));
m2 = nlfilter(P,[9 9],f2);

P_op=((P-m1)./(m2-m1)).*mg;
subplot(2,1,1),imagesc(P,[0 255]);colormap(gray);axis off;
subplot(2,1,2),imagesc(P_op,[0 255]);colormap(gray);axis off;
toc

Некоторые из результатов, которые я получил, показаны ниже:

введите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображения

Может ли кто-нибудь проверить и сказать мне, правильный ли мой код или нет? Я и сам не уверен. Также, пожалуйста, скажите мне, есть ли лучший способ сделать это. Заранее спасибо, ребята.

ОТРЕДАКТИРОВАННЫЙ вопрос Я перечитал работу и ** должен применить функцию скользящего окна только к нескольким указанным пикселям. **

Пиксели, которые я должен применить, выясняются в этом методе. Обнаружен начальный контур изображения (показан на изображениях красным цветом). Затем вокруг контура на заданном расстоянии проводится полоса. Функция скользящего окна должна применяться только к тем пикселям, которые находятся в пределах узкой полосы для исходных изображений

Даю изображения, и начальные контуры, и изображения полос.

введите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображения

Пиксели, отмеченные белым, являются моими указанными пикселями, к которым должна быть применена функция скольжения. Можно ли применять nfilter по таким критериям? Пожалуйста помоги. Я уточню дополнительно, если мой вопрос неверен.


person roni    schedule 02.12.2013    source источник
comment
Ваш код и ваши результаты кажутся хорошими на первый взгляд, но есть ли здесь реальный вопрос? Если нет, пожалуйста, закройте пост.   -  person Roney Michael    schedule 02.12.2013
comment
Я редактирую вопрос. Мой вопрос не был полным. Пожалуйста, просмотрите мой отредактированный вопрос.   -  person roni    schedule 02.12.2013
comment
вы можете рассмотреть возможность использования версии imdilate и imerode в оттенках серого для вычисления локального максимума/минимума каждого пикселя. Это может быть немного быстрее, чем nlfilt.   -  person Shai    schedule 02.12.2013
comment
@Shai Спасибо за ваше предложение. Я сделаю это. Не могли бы вы пересмотреть мой отредактированный вопрос?   -  person roni    schedule 02.12.2013
comment
@RoneyMichael Не могли бы вы пересмотреть мой отредактированный вопрос?   -  person roni    schedule 02.12.2013
comment
@roni - я не думаю, что nlfilt принимает маску. Что вы можете сделать, так это улучшить ВСЕ изображение (как вы это сделали), а затем объединить улучшенный результат с исходным изображением на основе вычисленной вами маски.   -  person Shai    schedule 02.12.2013
comment
@shai Спасибо, это отличная идея. Странно, почему до меня не дошло. Не могли бы вы предоставить мне короткий код для него?   -  person roni    schedule 02.12.2013
comment
CLAHE может быть вам полезен. Это адаптивный эквалайзер гистограммы. Вы можете найти его в OpenCV.   -  person Babak.Abad    schedule 09.04.2020


Ответы (1)


Я бы решил это одним из двух следующих способов:

  1. Примените фильтр ко всему изображению (используя colfilt вместо nlfilter).
    Затем умножьте результат на маску.
  2. Извлеките необходимые пиксели и их окрестности, сформировав их в форме столбца, как работает colfilt, и примените фильтр.

В любом случае будет работать.
Я думаю, что для небольших фотографий первый будет быстрее.

person Royi    schedule 16.04.2014