Лесен начин за подобряване на контраста на изображения в сивата скала с помощта на морфологични оператори в OpenCV

Въведение

Подобряването на контраста е много разпространена техника за обработка на изображения за подобряване на функциите в изображения с нисък контраст. Няколко метода като Разтягане на контраста, Изравняване на хистограма, Адаптивно изравняване на хистограма, Ограничено по контраст адаптивно изравняване на хистограмаили CLAHEи т.н. са използвани за подобряване на контраста на изображенията. В тази статия ще разгледаме друг метод за подобряване на контраста, който се извършва с помощта на комбинация от морфологични трансформации.

Какво представляват морфологичните трансформации или операторите?

Морфологичните трансформации или морфологичните оператори са прости трансформации на изображения, които обикновено се прилагат към двоични изображения, но могат да се прилагат и към изображения в нива на сивото. Има различни видове морфологични трансформации като ерозия, разширяване, отваряне, затваряне, градиент em>, цилиндъри черна шапка. Двата основни компонента на тези трансформации са входното изображение и ядрото, което е известно като Структуриращ елемент (SE). Преди да преминем към различните видове морфологични трансформации в детайли, нека разберем структуриращия елемент.

Какво представлява структуриращият елемент (SE)?

Структуриращият елемент (SE)е околността около всеки пиксел, който се изследва, докато се извършват морфологичните операции. Структуриращият елемент може да бъде с различни форми и размери и промяната му може значително да повлияе на ефективността на трансформацията.

Има три форми на структуриращия елемент, предоставени от OpenCV — Правоъгълна, Елипсовидна и Кръстовидна. Фигурата по-долу показва тези три форми.

Видове морфологични оператори

Различните видове морфологични оператори са:

  1. Ерозия —Според документацията на OpenCV, операторът Erosion работи подобно на ерозията на почвата. Той „ерозира“, или с по-прости думи, премахва границите на обекта на преден план в изображението. Пикселите на границата на обекта на преден план се премахват. Намалява размера на обекта в изображението.
  2. Разширяване —Разширяването действа точно обратното на ерозията. Той „разширява“ или разширява границите на обекта на преден план, което от своя страна увеличава размера на обекта в изображението. Това е полезно, ако искаме да съединим счупени части от обекта на преден план.
  3. Отваряне —Операцията за отваряне се използва при премахване на шума. Извършва се като първо се приложи ерозионна операция, последвана от дилатационна операция. Операцията по ерозия първо премахва всички малки зони с шум от изображението и след това се прилага дилатация, за да се възстанови оригиналният размер на обекта.
  4. Затваряне —Затварянето е обратното на отварянето, което означава, че първо се прилага разширяване, последвано от ерозия. Това е полезно за съединяване или запълване на малки петна, които присъстват в обекта на преден план, като същевременно запазва размера на обекта.
  5. Градиент —МорфологиченГрадиентът на изображение се получава чрез изваждане на резултата от ерозията от резултата от разширяването. Резултатът от операцията Gradient е очертанието на обекта на преден план в изображението.
  6. Цилиндър/Бяла шапка—Трансформацията на цилиндър, известна още като Трансформация на бяла шапка, се получава чрез премахване или изваждане на отварянето на изображението от оригиналното изображение. Този оператор ни дава ярките елементи в изображението, които са по-малки от структуриращия елемент.
  7. Черна шапка/долна шапка—Трансформацията на черната шапка, известна още като Трансформация на долната шапка, се получава чрез премахване или изваждане на затварянето на изображение от оригиналното изображение. Този оператор ни дава тъмните елементи в изображението, които са по-малки от структуриращия елемент.

Забележка: Трансформациите Цилиндър и Черна шапка са по-подходящи за изображения в сива скала.

Как морфологичните трансформации помагат за подобряване на контраста?

Подобряването на контраста, с прости думи, изисква да се направи следното:

  1. Прави светлите области в изображението по-ярки.
  2. Правене на тъмните области в изображението по-тъмни.

Както видяхме по-рано, резултатът от трансформацията на цилиндъра е изображение, състоящо се от всички ярки елементи във входното изображение, а резултатът от трансформацията на черната шапка е изображение, състоящо се от всички тъмни елементи във входното изображение. По този начин, за целите на подобряването на контраста, ще ни трябва горната част и трансформациите на черната шапка на входното изображение.

След като получим трансформациите Top и Black Hat на входното изображение, ние ще добавим трансформацията на Top Hat към входното изображение, за да направим ярките му области по-ярки, и ще извадим Black Hat Transform от входното изображение, за да направите тъмните области по-тъмни.

Стъпката, спомената по-горе, може да бъде представена като уравнение, показано по-долу:

където R е резултатното изображение, I е входното изображение, T и B са Цилиндърът и Black Hat се трансформира съответно.

Блок-схемата по-долу изобразява стъпките, които ще следваме, за да подобрим контраста.

Код

Ние ще приложим тази техника за подобряване на контраста с помощта на Python и OpenCV. Ще трябва първо да инсталираме opencv-python с помощта на pip.

pip install opencv-python

След като инсталираме OpenCV, ще импортираме библиотеката в нашия код.

import cv2 as cv

Ще използваме изображението по-долу за нашия код, който е взет от COVID-19 Image Repository в GitHub.

Данните за изображения в това хранилище са събрани от Института за диагностична и интервенционална радиология, Медицинско училище в Хановер, Хановер, Германия и са лицензирани под Creative Commons Attribution 3.0 Unported.

Намалих изображението с 50%, за да намаля размера му.

За да прочетем това изображение, ще използваме функцията imread от OpenCV.

filename = # path to the image file
img = cv.imread(filename,0)

Сега, когато имаме нашето изображение, ще получим горната част и трансформациите на черната шапка на това изображение. Преди това трябва да конструираме нашия структуриращ елемент или ядрото. Можем да използваме функцията getStructuringElement, предоставена от OpenCV за тази цел.

kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))

В горния фрагмент сме конструирали елиптичен структуриращ елемент с размер (5,5). Можете да експериментирате, като промените тези параметри и наблюдавате ефекта върху изхода.

Следващата стъпка е да получим трансформациите на входното изображение с помощта на ядрото, което конструирахме в предишната стъпка.

# Top Hat Transform
topHat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
# Black Hat Transform
blackHat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)

След като имаме нашите трансформации, ще приложим уравнението, което видяхме по-рано.

res = img + topHat - blackHat

Виждаме, че контрастът на входното изображение се е подобрил малко. Някои от малките характеристики, които не са били изпъкнали във входното изображение, вече са видими. Въпреки това, тази техника добавя известен шум към изображението, ако структуриращият елемент не е избран внимателно.

Например, изображението по-долу показва резултата, когато е избран елиптичен структуриращ елемент с размер (15,15). Дребните характеристики в белите дробове и краищата на костите вече са по-изпъкнали и ясни от по-ранния изход, но можем да видим някои шумни зони в изходното изображение, близо до границите на тялото, т.е. белите петна на заден план.

Докато продължавате да увеличавате размера на структуриращия елемент, функциите на преден план ще стават по-забележими, но фонът ще започне да става все по-шумен. Резултатът по-долу със структуриращ елемент с размер (35,35) има по-шумна област на заден план.

Заключение

Така видяхме как да подобрим контраста на изображенията в сивата скала, използвайки комбинация от морфологични операции Top Hat и Black Hat. Някои от малките характеристики бяха значително подобрени и станаха по-забележими в нашето изходно изображение, както се вижда по-горе.

Точки за запомняне

  1. Този метод може да не работи толкова ефективно, колкото оригиналния метод за разтягане на контраста поради шума, който въвежда в изображението, докато продължаваме да увеличаваме размера на нашия структуриращ елемент.
  2. Тъй като структуриращият елемент е основно размерът на квартала, който трябва да се има предвид, докато се прилагат трансформациите, изходът също ще зависи от размера на входното изображение. Например (35,35) ядро ​​за изображение с размер 1000 x 1000 ще образува по-малък регион в сравнение с (35,35) ядро ​​за изображение с размери 250 x 250. По този начин преоразмеряването на изображението също ще повлияе на резултата от този метод.
  3. Тъй като Top и Black Hat Transforms ни дават съответно по-ярките и по-тъмните елементи, които са по-малки от структуриращия елемент,този метод за подобряване на контраста ще работи добре, ако размерът на елементите за подобряване е по-малък от размера на избрания от нас структурен елемент. По този начин става трудно точно да се подобри контрастът на по-големите характеристики, тъй като по-големите размери на нашето ядро ​​ще въведат по-големи шумни области във фона на нашето изображение.

Благодаря ви, че прочетохте! :) Можете да се свържете с мен в LinkedIn, ако имате въпроси.

Препратки

  1. OpenCV: Морфологични трансформации https://docs.opencv.org/3.4/d9/d61/tutorial_py_morphological_ops.html
  2. Кушол Р., Нишат Р. М., Рахман А. Б. М. А., Салекин М. М., „Подобряване на контраста на медицинско рентгеново изображение с помощта на морфологични оператори с оптимален структуриращ елемент“, arXiv:1905.08545v1 [cs.CV] 27 май 2019 г.
  3. Хинрих Б. Винтер, Ханс Лазер, Светлана Гербел, Сабине К. Машке, Ян Б. Хинрихс, Йенс Фогел-Клаусен, Франк К. Вакер, Мариус М. Хьопер, Бернхард К. Майер, „Хранилище за изображения на COVID-19“, DOI : 10.6084/m9.figshare.12275009