/
Art_Lun
/
ComputerVision
Обзор
Документация
Войти
/
Art_Lun
/
ComputerVision
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
part5/Python/Matveev_part_5.py
157 строк
7 KB
Art_Lun
Добавлена презентация
21 дек 2025, 01:10
21 дек 2025, 01:10
3a4bb58
Код
Авторство
О чём код?
# Импорт библиотек import cv2 as cv from matplotlib import pyplot as plt from PIL import Image, ImageDraw # для 3 скрипта import random # для 3 скрипта def ApplyThresholdOperations(): # Загрузка изображения в оттенках серого, можно использовать cv2.IMREAD_GRAYSCALE вместо 0 img = cv.imread('Gradations_of_gray.jpg', 0) # Применение функций пороговой обработки изображений # ret значение порога, которое использовалось в процессе порогового значения ret,thresh1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY) ret,thresh2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV) # Применяем TRUNC thresh3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)[1] thresh4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)[1] thresh5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)[1] # Вывод ихображений на экран title = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in range(6): plt.subplot(2,3,i+1) plt.imshow(images[i], 'gray', vmin=0, vmax=255) # Фиксированный диапазон для всех plt.title(title[i]) plt.xticks([]),plt.yticks([]) plt.show() def AdaptiveTresholding(): # Загрузка и предобработка изображения img = cv.imread('DepecheMode_EnjoytheSilence.jpg', 0) img = cv.medianBlur(img, 3) # Медианный фильтр для удаления шума (эффективен на шуме соль-перец) # Глобальное пороговое значение ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY) # Адаптивное пороговое значение (среднее арифметическое всех пикселей в окрестности выделенного пикселя) th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2) # Адаптивное пороговое значение (Гауссово - берётся взвешенная сумма значений окрестностей, причем весовые коэффициенты находятся с помощью функции Гаусса. ) th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,2) # Вывод ихображений на экран titles = ['Original Image', 'Global Thresholding (v =127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] images = [img, th1, th2, th3] plt.figure(figsize=(14, 7)) # ширина 14 дюймов, высота 7 дюймов for i in range(4): plt.subplot(2, 2, i+1) plt.imshow(images[i], 'gray', vmin=0, vmax=255) plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.tight_layout() # автоматическое расстояние между subplots plt.show() def NoisyImage(): image_orig = cv.imread('Peaky_blinders.jpg') # загрузка оригинального изображения image_orig_rgb = cv.cvtColor(image_orig, cv.COLOR_BGR2RGB) # конвертируем BGR в RGB image = Image.open('Peaky_blinders.jpg') # Открываем изображение draw = ImageDraw.Draw(image) # Создаем инструмент для рисования width = image.size[0] # Определяем ширину height = image.size[1] # Определяем высоту pix = image.load() # Выгружаем значения пикселей for i in range(width): for j in range(height): rand = random.randint(0, 130) # Добавление шума к каждому цветовому каналу текущего пикселя a = pix[i, j][0] + rand b = pix[i, j][1] + rand c = pix[i, j][2] + rand if (a > 255): a = 255 if (b > 255): b = 255 if (c > 255): c = 255 draw.point((i, j), (a, b, c)) image.save("Peaky_blinders_noisy.png", "PNG") # сохранить изображение # Вывод ихображений на экран titles = ['Original Image', 'Noisy Image'] images = [image_orig_rgb, image] plt.figure(figsize=(14, 7)) # ширина 14 дюймов, высота 7 дюймов for i in range(2): plt.subplot(1, 2, i+1) plt.imshow(images[i]) plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.tight_layout() # автоматическое расстояние между subplots plt.show() def BinarizationOtsu(): # Загрузка и предобработка изображения img = cv.imread('Peaky_blinders_noisy.png',0) ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY) # Глобальная обработка ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # Обработка Otsu blur = cv.GaussianBlur(img,(5,5),0) # Фильтр Гаусса ret3,th3 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # Обработка Otsu’s после фильтра Гаусса images = [img, 0, th1, img, 0, th2, blur, 0, th3] titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image', 'Histogram','Otsu’sThresholding', 'Gaussian filtered Image', 'Histogram','Otsu’s Thresholding'] # Увеличиваем размер фигуры plt.figure(figsize=(15, 20)) for i in range(3): # Первое изображение plt.subplot(3, 3, i*3+1) plt.imshow(images[i*3], 'gray', vmin=0, vmax=255, aspect='auto') plt.title(titles[i*3], fontsize=12, fontweight='bold') plt.xticks([]) plt.yticks([]) # Гистограмма plt.subplot(3, 3, i*3+2) plt.hist(images[i*3].ravel(), 256, color='blue', alpha=0.7) plt.title(titles[i*3+1], fontsize=12, fontweight='bold') plt.xlabel('Интенсивность пикселей') plt.ylabel('Частота') plt.grid(True, alpha=0.3) # Второе изображение plt.subplot(3, 3, i*3+3) plt.imshow(images[i*3+2], 'gray', vmin=0, vmax=255, aspect='auto') plt.title(titles[i*3+2], fontsize=12, fontweight='bold') plt.xticks([]) plt.yticks([]) # Улучшаем компоновку и добавляем общий заголовок plt.suptitle('Анализ изображений и гистограмм', fontsize=16, fontweight='bold') plt.tight_layout() plt.subplots_adjust(top=0.93) plt.show() if __name__ == "__main__": # ApplyThresholdOperations() AdaptiveTresholding() NoisyImage() BinarizationOtsu()