Онлайн поддержка
Все операторы заняты. Пожалуйста, оставьте свои контакты и ваш вопрос, мы с вами свяжемся!
ВАШЕ ИМЯ
ВАШ EMAIL
СООБЩЕНИЕ
* Пожалуйста, указывайте в сообщении номер вашего заказа (если есть)

Войти в мой кабинет
Регистрация
ГОТОВЫЕ РАБОТЫ / КУРСОВАЯ РАБОТА, РАЗНОЕ

Методы обработки графических изображений

Workhard 140 руб. КУПИТЬ ЭТУ РАБОТУ
Страниц: 19 Заказ написания работы может стоить дешевле
Оригинальность: неизвестно После покупки вы можете повысить уникальность этой работы до 80-100% с помощью сервиса
Размещено: 04.07.2022
Изображение – это массив пикселей. На данный момент есть множество задач для выполнения которых требуется выбирать пиксель выше (ниже, между) определенного порогового значения. Для решения подобных задач применяем функцию cvThreshold(). Если значение пикселя больше порогового значения, ему присваивается одно значение (может быть белым), иначе ему присваивается другое значение (может быть черным). Используемая функцию равна порогу. Первый аргумент – это исходное изображение, которое должно быть полутоновым изображением. Второй аргумент - это пороговое значение, которое используется для классификации значений пикселей. Третий аргумент - maxVal|, который представляет значение, которое должно быть задано, если значение пикселя больше (иногда меньше) порогового значения. OpenCV предоставляет разные стили порога и определяется четвертым параметром функции. Различные типы: cv.THRESH_BINARY cv.THRESH_BINARY_INV cv. THRESH_TRUNC cv. THRESH_TOZERO cv. THRESH_TOZERO_INV cv. THRESH_OTSU Документация четко объясняет, для чего предназначен каждый тип. Ниже представлен код: import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('gradient.png',0) ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY) ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV) ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC) ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO) ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV) titles = ['OriginalImage','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in xrange(6): plt.subplot(2,3,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() Рисунок 11 – Методы бинаризации изображения Если изображение имеет различные условия освещения в разных областях. В этом случае мы идем на адаптивное пороговое значение. При этом алгоритм вычисляет порог для небольших областей изображения. Таким образом, мы получаем разные пороговые значения для разных областей одного и того же изображения, и это дает нам лучшие результаты для изображений с различным освещением. Он имеет три «специальных» входных параметра и только один выходной аргумент. Адаптивный метод. Он определяет, как вычисляется пороговое значения. cv.ADAPTIVE_THRESH_MEAN_C: пороговое значение является средним значением области окрестности. cv.ADAPTIVE_THRESH_GAUSSIAN_C: пороговое значение представляет собой взвешенную сумму значений окрестности, где веса являются гауссовым окном. BlockSize - размер окрестности (в пикселях), которая используется для расчёта порогового значения. C - это просто константа, которая вычитается из среднего или взвешенного среднего значения. Пример кода: import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('sudoku.png',0) img = cv.medianBlur(img,5) ret,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] for i in xrange(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() В глобальном пороговом значении используется произвольное значение для порогового значения. Для того что бы определить насколько хорошо выбран порог необходимо сделать несколько итераций по выбранному порогу. Но если рассмотреть бимодальное изображение (бимодальное изображение - изображение, гистограмма которого имеет два пика). Для этого изображения возможно приблизительно выбрать значение в середине этих пиков как пороговое значение. Это то, что делает бинаризация Оtsu. Таким образом он автоматически вычисляет пороговое значение из гистограммы изображения для бимодального изображения. (Для изображений, которые не являются бимодальными, бинаризация не будет точной.) Для этого используется функция cv.threshold(), но с дополнительным флагом cv.THRESH_OTSU. Для порогового значения будет выполнен ноль. Затем алгоритм находит оптимальное пороговое значение и возвращает в качестве второго выхода retVal. Если порог Otsu не используется, retVal будет таким же, как и пороговое значение, которое использовалось изначально. Пример бинаризации методом Оцу изображен на рисунке 12. Входное изображение - шумное изображение. В первом случае применено глобальное пороговое значение для значения 127. Во втором случае применен порог Otsu напрямую. В третьем случае отфильтровано изображение с 5х5 гауссовым ядром, чтобы удалить шум, а затем применен порог Otsu. import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('noisy2.png',0) # global thresholding ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY) # Otsu's thresholding ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # Otsu's thresholding after Gaussian filtering blur = cv.GaussianBlur(img,(5,5),0) ret3,th3 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # plot all the images and their histograms images = [img, 0, th1, img, 0, th2, blur, 0, th3] titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding", 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"] for i in xrange(3): plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray') plt.title(titles[i*3]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256) plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray') plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([]) plt.show()
Введение

Изображение – это массив пикселей. На данный момент есть множество задач для выполнения которых требуется выбирать пиксель выше (ниже, между) определенного порогового значения. Для решения подобных задач применяем функцию cvThreshold(). Если значение пикселя больше порогового значения, ему присваивается одно значение (может быть белым), иначе ему присваивается другое значение (может быть черным). Используемая функцию равна порогу. Первый аргумент – это исходное изображение, которое должно быть полутоновым изображением. Второй аргумент - это пороговое значение, которое используется для классификации значений пикселей. Третий аргумент - maxVal|, который представляет значение, которое должно быть задано, если значение пикселя больше (иногда меньше) порогового значения. OpenCV предоставляет разные стили порога и определяется четвертым параметром функции. Различные типы: cv.THRESH_BINARY cv.THRESH_BINARY_INV cv. THRESH_TRUNC cv. THRESH_TOZERO cv. THRESH_TOZERO_INV cv. THRESH_OTSU Документация четко объясняет, для чего предназначен каждый тип. Ниже представлен код: import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('gradient.png',0) ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY) ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV) ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC) ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO) ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV) titles = ['OriginalImage','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in xrange(6): plt.subplot(2,3,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() Рисунок 11 – Методы бинаризации изображения Если изображение имеет различные условия освещения в разных областях. В этом случае мы идем на адаптивное пороговое значение. При этом алгоритм вычисляет порог для небольших областей изображения. Таким образом, мы получаем разные пороговые значения для разных областей одного и того же изображения, и это дает нам лучшие результаты для изображений с различным освещением. Он имеет три «специальных» входных параметра и только один выходной аргумент. Адаптивный метод. Он определяет, как вычисляется пороговое значения. cv.ADAPTIVE_THRESH_MEAN_C: пороговое значение является средним значением области окрестности. cv.ADAPTIVE_THRESH_GAUSSIAN_C: пороговое значение представляет собой взвешенную сумму значений окрестности, где веса являются гауссовым окном. BlockSize - размер окрестности (в пикселях), которая используется для расчёта порогового значения. C - это просто константа, которая вычитается из среднего или взвешенного среднего значения. Пример кода: import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('sudoku.png',0) img = cv.medianBlur(img,5) ret,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] for i in xrange(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() В глобальном пороговом значении используется произвольное значение для порогового значения. Для того что бы определить насколько хорошо выбран порог необходимо сделать несколько итераций по выбранному порогу. Но если рассмотреть бимодальное изображение (бимодальное изображение - изображение, гистограмма которого имеет два пика). Для этого изображения возможно приблизительно выбрать значение в середине этих пиков как пороговое значение. Это то, что делает бинаризация Оtsu. Таким образом он автоматически вычисляет пороговое значение из гистограммы изображения для бимодального изображения. (Для изображений, которые не являются бимодальными, бинаризация не будет точной.) Для этого используется функция cv.threshold(), но с дополнительным флагом cv.THRESH_OTSU. Для порогового значения будет выполнен ноль. Затем алгоритм находит оптимальное пороговое значение и возвращает в качестве второго выхода retVal. Если порог Otsu не используется, retVal будет таким же, как и пороговое значение, которое использовалось изначально. Пример бинаризации методом Оцу изображен на рисунке 12. Входное изображение - шумное изображение. В первом случае применено глобальное пороговое значение для значения 127. Во втором случае применен порог Otsu напрямую. В третьем случае отфильтровано изображение с 5х5 гауссовым ядром, чтобы удалить шум, а затем применен порог Otsu. import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('noisy2.png',0) # global thresholding ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY) # Otsu's thresholding ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # Otsu's thresholding after Gaussian filtering blur = cv.GaussianBlur(img,(5,5),0) ret3,th3 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # plot all the images and their histograms images = [img, 0, th1, img, 0, th2, blur, 0, th3] titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding", 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"] for i in xrange(3): plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray') plt.title(titles[i*3]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256) plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray') plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([]) plt.show()
Содержание

Введение Глава 1. Методы обработки графических изображений 1.1.Бинаризация изображений 1.2. Нахождение контуров 1.3. Метод Оцу Глава 2. Разработка и программная реализация алгоритма бинаризации изображений методом Оцу 2.1. Пороговый алгоритм Оцу бинаризации изображений 2.2. Обзор программного продукта Заключение
Список литературы

Рамка обработки изображения «Colom» используется для чтения входных изображений. Её структура помогает открывать изображения PNG и JPEG и позволяет работать с изображением как с одномерным вектором (один вектор для каждого цветного канала). Длина каждого вектора равна М x N, где М - количество строк изображения, а N - количество столбцов изображения соответственно; это представляет особый интерес при доступе к каждому пикселю на изображении и при вычислении гистограммы изображения. Эта структура также полезна для проверки параметров ввода алгоритма, используя: возможности возврата ошибок, когда входные параметры отсутствуют или написаны с ошибкой. Поскольку алгоритм Оцу работает с изображениями в оттенках серого, алгоритм предполагает, что вход изображение имеет один цветной канал; в случае, если это требование не выполняется, возвращается ошибка. Первый цикл (строки 9-11) выполняет итерацию по каждому пикселю, накапливая счетчики для каждого graylevel пиксель, чтобы вычислить гистограмму изображения. После этого полученная гистограмма используется для вычисления порогового значения Оцу, обновив q_i (t) и ?_i (t) (строки 15-24), которые используются для получения ?_b^2 (t) (строка 25). Как только пороговое значение найдено для входного изображения, создается новое выходное изображение, на котором применяется сегментирование порога по входному изображению с использованием вычисленного порогового значения (строки 29 - 33). Новое изображение, которое соответствует сегментированной версии входного изображения (строка 34). Алгоритм позволяет переопределить пороговое значение (ручной порог), чтобы увидеть, какой будет выход, если выбрано другое пороговое значение. Что касается вычислительной сложности предлагаемой реализации, то количество операций задается четырьмя циклами в коде: Первый цикл (строки 5-6) в алгоритме соответствует инициализации гистограммы, требующей О(max_intensity + 1); Второй цикл (строки 9-11) выполняется для вычисления гистограммы для входного изображения, требует операций О(N), N - произведением ширины и высоты входного изображения; Третий цикл (строки 15-28) используется для вычисления значений взвешенной дисперсии внутри класса ?_b^2 (t), он имеет сложность операций О(max_intensity + 1); и наконец, Четвертый цикл, чтобы определить выходное изображение (строки 29- 33), требует О(N) операций. Таким образом, вся реализация С ++ для алгоритма Оцу включает операции О(max_intensity + 1), то есть он является линейным по числу пикселей во входном изображении. Этот алгоритм имеет ясный статистический смысл и, как показывает практика, является эффективным и устойчивым способом определения адаптивного порога для бинаризации бимодальных изображений.
Отрывок из работы

Рамка обработки изображения «Colom» используется для чтения входных изображений. Её структура помогает открывать изображения PNG и JPEG и позволяет работать с изображением как с одномерным вектором (один вектор для каждого цветного канала). Длина каждого вектора равна М x N, где М - количество строк изображения, а N - количество столбцов изображения соответственно; это представляет особый интерес при доступе к каждому пикселю на изображении и при вычислении гистограммы изображения. Эта структура также полезна для проверки параметров ввода алгоритма, используя: возможности возврата ошибок, когда входные параметры отсутствуют или написаны с ошибкой. Поскольку алгоритм Оцу работает с изображениями в оттенках серого, алгоритм предполагает, что вход изображение имеет один цветной канал; в случае, если это требование не выполняется, возвращается ошибка. Первый цикл (строки 9-11) выполняет итерацию по каждому пикселю, накапливая счетчики для каждого graylevel пиксель, чтобы вычислить гистограмму изображения. После этого полученная гистограмма используется для вычисления порогового значения Оцу, обновив q_i (t) и ?_i (t) (строки 15-24), которые используются для получения ?_b^2 (t) (строка 25). Как только пороговое значение найдено для входного изображения, создается новое выходное изображение, на котором применяется сегментирование порога по входному изображению с использованием вычисленного порогового значения (строки 29 - 33). Новое изображение, которое соответствует сегментированной версии входного изображения (строка 34). Алгоритм позволяет переопределить пороговое значение (ручной порог), чтобы увидеть, какой будет выход, если выбрано другое пороговое значение. Что касается вычислительной сложности предлагаемой реализации, то количество операций задается четырьмя циклами в коде: Первый цикл (строки 5-6) в алгоритме соответствует инициализации гистограммы, требующей О(max_intensity + 1); Второй цикл (строки 9-11) выполняется для вычисления гистограммы для входного изображения, требует операций О(N), N - произведением ширины и высоты входного изображения; Третий цикл (строки 15-28) используется для вычисления значений взвешенной дисперсии внутри класса ?_b^2 (t), он имеет сложность операций О(max_intensity + 1); и наконец, Четвертый цикл, чтобы определить выходное изображение (строки 29- 33), требует О(N) операций. Таким образом, вся реализация С ++ для алгоритма Оцу включает операции О(max_intensity + 1), то есть он является линейным по числу пикселей во входном изображении. Этот алгоритм имеет ясный статистический смысл и, как показывает практика, является эффективным и устойчивым способом определения адаптивного порога для бинаризации бимодальных изображений.
Условия покупки ?
Не смогли найти подходящую работу?
Вы можете заказать учебную работу от 100 рублей у наших авторов.
Оформите заказ и авторы начнут откликаться уже через 5 мин!
Похожие работы
Курсовая работа, Разное, 44 страницы
600 руб.
Курсовая работа, Разное, 34 страницы
250 руб.
Служба поддержки сервиса
+7 (499) 346-70-XX
Принимаем к оплате
Способы оплаты
© «Препод24»

Все права защищены

/slider/1.jpg /slider/2.jpg /slider/3.jpg /slider/4.jpg /slider/5.jpg