четвер, 22 квітня 2021 р.

Арифметичні операції над зображеннями

Mathedemo Зображення в OpenCV є об'єктом класу numpy.ndarray з елементами типу uint8, тобто беззнаковими цілими числами в діапазоні $[0,255]$, тому над зображеннями однакового розміру можна виконувати ті самі операції що і над масивами:
 
img=img1+img2# додавання зображень
img=img1-img1#віднімання  зображень
img= c*img # множення зображення на число с
img=img+c # додавання числа с до зображення
img=img-c # додавання від  зображення  числа с
 
В результаті додавання двох зображень вони накладаються одне на одне.

Операція віднімання застосовується коли потрібно знайти відмінності між візуально схожими зображеннями.

Операція множення на число збільшує контрастність зображення, а операція додавання числа збільшує яскравість кожного пікселя не змінюючи контрастності зображення.

Всі операції виконуються за модулем 256, тому, у випадку коли значення пікселя виходить за межі діапазону $[0,255]$, можливе спотворення зображення. Наприклад

 
img[100,100]=255
img=img+2
print(img[100,100])
1 # 255+2%256=1
img=img-3
print(img[100,100])
254#(1-3)%256=254
 
В бібліотеці OpenCV функції cv2.add() i cv2.subtract() реалізують інший алгоритм додавання зображень, при якому у випадку виходу значення пікселя за межі, встановлюють його значення рівним 0 або 255.
 
image[100,100]=255
image=cv2.add(image,2)# OpenCV додавання
print(image[100,100])
255
cv2.subtract(image,300)# OpenCV віднімання
print(image[100,100])
0
Змішування (blending) двох зображень, тобто їхня зважена сума $$ {\tt img=\alpha \cdot img1+\beta \cdot img2+\gamma } $$ виконується функцією cv2.addWeighted, приклад використання
 
 cv2.addWeighted(cv2.addWeighted(img1,0.7,img2,0.3,0)
При застосуванні функцій потрібно стежити чи не змінився тип елементів масиву, а також, чи їхні значення не вийшли за допустимі межі, інакше при спробі відобразити зображення виникне повідомлення про помилку. Рекомендується виконувати обрізання діапазону функцією np.clip та приводити масив до цілого типу:
 
img=np.clip(img**3,0,255).astype(np.uint8)# куб зображення

Немає коментарів:

Дописати коментар