Изначально я разместил это как ответ на Quora- › https://qr.ae/TUhbkB

Одно из самых удивительных, которые я обнаружил, - это умное вычисление краев изображения с помощью вычислений.

Рассмотрим черно-белое изображение

Здесь я увеличил изображение небольшого региона.

Как видите, в нем много пикселей.

Его можно представить как 2D-матрицу со следующими ограничениями:

  1. в AijAij i представляет координату x пикселя, j представляет координату y
  2. верхняя левая точка - координата (0,0)
  3. x ie i увеличивается при движении вправо, а y ie j увеличивается при движении вниз
  4. значение 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 , мы сможем найти края, не попадая под влияние тени или освещения.

Могут быть и другие способы.

Спасибо за терпение (Бхану Дутта Парашар)