Изначально я разместил это как ответ на Quora- › https://qr.ae/TUhbkB
Одно из самых удивительных, которые я обнаружил, - это умное вычисление краев изображения с помощью вычислений.
Рассмотрим черно-белое изображение
Здесь я увеличил изображение небольшого региона.
Как видите, в нем много пикселей.
Его можно представить как 2D-матрицу со следующими ограничениями:
- в AijAij i представляет координату x пикселя, j представляет координату y
- верхняя левая точка - координата (0,0)
- x ie i увеличивается при движении вправо, а y ie j увеличивается при движении вниз
- значение AijAij варьируется от 0 до 255, 0 означает черный 255 означает белый
Таким образом, матрица для этого небольшого региона будет
Теперь рассмотрим только одну строку матрицы.
т.е. что-то вроде этого
представлен как:
Если мы изобразим это на графике:
это будет похоже
In the below graphs: X axis : x coordinate of pixel Y axis : value of pixel
Помните, что высокое значение означает больше белого. Низкое значение означает больше черного в диапазоне от 0 до 255.
А теперь самое интересное:
что, если мы дифференцируем этот график, считая его функцией y = f (x).
здесь y - значение AijAij, а x - это i матрицы (здесь y другое)
Итак, давайте изобразим его производную
Как вы можете видеть, в момент изменения изображения с белого на черный значение производной внезапно увеличивается.
что, если мы продолжим дифференцировать, т. е. двойное дифференцирование
так что вы можете увидеть резкую неровность в области изменения.
отметим точку в строке изображения:
Теперь, если мы применим эту вещь для всех строк и отметим точки высокого значения двойной производной.
по краю изображения
Аналогичным образом возьмите его для всех столбцов, и вы получите полные края изображений.
Математическая реализация, часть 2 (более впечатляющая, чем указано выше)
Как это различие может быть применено к изображениям с помощью компьютера:
Некоторые математики обнаружили явление под названием Свертка, позвольте мне сначала объяснить это:
- Рассмотрим большую матрицу NxN и маленькую матрицу 3x3:
Источник: Свертки с OpenCV и Python - PyImageSearch
Здесь, если скалярное произведение маленькой матрицы выполняется со всеми частями большой матрицы размером 3x3. Точечный продукт означает, что каждый элемент умножается на его r соответствующие элементы, например. 131 * (- 1), 162 * 0, 232 * 1 и так далее.
Результат сохранен в другой матрице.
Этот процесс называется Свертка, здесь матрица 3x3 - это ядро, она может быть даже больше, но чаще всего используется матрица 3x3.
Феномен заключается в том, что если большая матрица свернута с ядром, области, похожие на ядро, выделяются (значение увеличивается) в результирующей матрице, тогда как несхожие области становятся темными.
Ядра, представляющие двойное дифференцирование:
Они также называются ядрами Собеля.
Реализация OpenCV на основе C ++, часть 3
#include<opencv2/opencv.hpp> #include <fstream> using namespace cv; float data1[][3]={-1,0,1, -2,0,2, -1,0,1}; float data2[][3]={1,2,1, 0,0,0, -1,-2,-1}; int main() { Mat frame; VideoCapture cap(0); Mat kernel1(3,3,CV_32FC1,&data1); Mat kernel2(3,3,CV_32FC1,&data2); kernel1 = kernel1*2; kernel2 = kernel2*2; while(1) { cap>>frame; cvtColor(frame,frame,COLOR_BGR2GRAY); Mat out1,out2,out; filter2D(frame,out1,-1,kernel1); filter2D(frame,out2,-1,kernel2); out = out1/2+out2/2; threshold(out,out,80,255,THRESH_BINARY); imshow("Input",frame); imshow("Output",out); waitKey(1); } }
Вывод:
Многие улучшения можно сделать, удалив шум, используя производные по Гауссу, обнаружив края Canny. Их можно легко изучить в Интернете
Изображения: Все изображения, кроме изображения, снабженного ссылкой, были сняты и отредактированы только мной.
Как его можно распространить на цветные изображения
Цвета обычно представлены как значения RGB (здесь в OpenCV это BGR).
B- ›Синий, G-› Зеленый, R- ›Красный обнаружение краев обычно выполняется после преобразования цветного изображения в черно-белое.
Но есть еще один метод: изображение можно преобразовать в цветовое пространство HSV. Здесь H означает оттенок, S означает насыщенность, V означает Value т.е. H указывает цвет, S указывает интенсивность, V указывает яркость
Источник: HSL и HSV - Википедия
Поэтому, если мы возьмем только H или Hue , мы сможем найти края, не попадая под влияние тени или освещения.
Могут быть и другие способы.
Спасибо за терпение (Бхану Дутта Парашар)