Резюме обучения Android Lab CV за 2018 г.

OpenCV

Обучение резюме Android Lab

OpenCV

Преобразование Фурье (пространственная область -> частотная область)

Что такое преобразование Фурье?

维基百科:

Преобразование Фурье ( французский : Transformation de Fourier , английский : преобразование Фурье ) представляет собой линейное интегральное преобразование, используемое для преобразования сигнала между временной (или пространственной) и частотной областями, многие из которых применяются в физике и технике. Поскольку его основная идея была впервые систематически выдвинута французским ученым Жозефом Фурье, она была названа в его честь в память о ней. По сути, преобразование Фурье похоже на химический анализ для определения основных компонентов материи; сигналы от природы также можно анализировать для определения их основных компонентов.

Говоря простым языком, любую функцию с периодическим преобразованием можно разложить на суперпозицию многих тригонометрических функций с разными частотами.

傅里叶变换

Наблюдайте всю разложенную тригонометрическую функцию с направления частоты

变换结果

Какова роль преобразования Фурье в обработке изображений?

1. Улучшение изображения и шумоподавление изображения

  • Большая часть шума представляет собой высокочастотную составляющую изображения, а высокочастотный шум отфильтровывается фильтром нижних частот; край также является высокочастотным компонентом изображения, а край оригинала изображение можно усилить, добавив высокочастотные составляющие;

2. Обнаружение края сегментации изображения

  • Извлечение высокочастотных компонентов изображения

3. Извлечение признаков изображения:

  • Особенности формы: Фурье-описание
  • Текстурные характеристики: рассчитывайте текстурные особенности непосредственно с помощью коэффициентов Фурье.
  • Другие функции: преобразование Фурье извлеченных собственных значений, чтобы сделать функции инвариантными к перемещению, масштабированию и вращению.

4. Сжатие изображений

  • Данные могут быть сжаты непосредственно коэффициентом Фурье, обычно используемое дискретное косинусное преобразование является действительным преобразованием преобразования Фурье;

обнаружение вертикального края

Края — это границы областей изображения, где оттенки серого резко меняются. В изображении есть переходы между пикселями, и цель обнаружения границ — найти эти пиксели. Вывод цифровых изображений осуществляется с помощью дифференциального приближенного дифференцирования.

垂直边缘检测I.=png

Первое, о чем стоит поговорить, это оператор обнаружения границ.

оператор первой производной

  1. Оператор Робертса

Оператор Робертса — это метод расчета градиента для точек наклонного отклонения. Размер градиента представляет силу края, а направление градиента перпендикулярно направлению края. Оператор Робертса имеет высокую точность позиционирования и хороший эффект в горизонтальное и вертикальное направления Ядра свертки Gx и Gy:

Roberts算子

  1. оператор Собеля

Оператор Собеля представляет собой набор операторов направления, которые обнаруживают ребра с разных направлений. Оператор Собеля обычно лучше подходит для градиентов оттенков серого и изображений с большим количеством шума. Два ядра свертки Gx и Gy:

Sobel算子

  1. Оператор Превитта

Оператор Prewitt — это оператор шаблона края, который использует разницу в оттенках серого между верхней, нижней, левой и правой соседними точками пикселя для обнаружения края в экстремальном значении, что оказывает сглаживающее воздействие на шум. Два ядра свертки Gx и Gy:

Prewitt算子

оператор второй производной

  1. оператор Лапласа

Оператор Лапласа — широко используемый оператор второй производной. На практике положение ребра можно определить по свойствам точки пересечения нуля оператора второй производной. На рисунке показаны два часто используемых шаблона:

Laplacian算子

  1. Хитрый оператор Оператор Кэнни преобразует задачу обнаружения ребер в задачу обнаружения максимального значения единичной функции. А OpenCV предоставляет более простую функцию Canny.
#include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;

int main(int argc, int argv)
{
    //载入图像
    Mat srcImage = imread("D:\\Desktop\\pic.jpg");
    if (srcImage.empty())
    {
        cout << "can not find the img" << endl;
    }
    //显示原始图
    imshow("【原图】Canny边缘检测", srcImage);
    Mat edge, greyImage; //参数定义

    //【1】将原图像转换为灰度图像
    cvtColor(srcImage, greyImage, CV_BGR2GRAY);

    //【2】先使用3×3内核来降噪
    blur(greyImage, edge, Size(3, 3));

    //【3】运行Canny算子
    Canny(edge, edge, 3, 9, 3);

    //【4】显示效果图
    imshow("均值滤波【效果图】", edge);

    waitKey(0); //等待任意按键按下
    return 0;
}

фильтрация изображений

Фильтрация изображения, то есть подавление шума целевого изображения при условии максимально возможного сохранения деталей изображения, то есть удаление неактуального шума и сохранение полезной информации

  • Сглаживание — шумоподавление, такое как отбраковка птицы на изображении, вычисляет приближение на основе значений пикселей с обеих сторон окружающей области и заменяет его средним значением, то есть интегрирует изображение.
  • Повышение резкости - усиливает шум, например, усиливает отображение птицы, увеличивает разницу по краям изображения, т. е. делает изображение различимым.

Фильтровать общий API

  • обнаружение края
  • Собель, Лапласиан
  • Шумоподавление/сглаживание изображения
  • GaussianBlur

центральная разница


#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#define WINDOW_NAME "【程序窗口】"

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
    Mat srcImage = imread("D:\\Desktop\\lena.jpg", 1); //读取图片
    cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);      //转为灰度图像

    namedWindow("srcImage", WINDOW_AUTOSIZE); //新建窗口
    imshow("srcImage", srcImage);             //显示图像
    //waitKey(0);  //图像显示为一帧

    //由于中心差分的原因,输出图像比原始图象少了两列
    Mat dImage = Mat(srcImage.rows, srcImage.cols - 2, CV_8UC1);

    //循环遍历整个图像
    for (int i = 0; i < srcImage.rows; i++)
    {
        for (int j = 1; j < srcImage.cols - 1; j++)
        {
            //对整型数据类型进行运算,进行中心差分
            dImage.at<uchar>(i, j - 1) = srcImage.at<uchar>(i, j + 1) - srcImage.at<uchar>(i, j - 1);
        }
    }
    namedWindow("dImage", WINDOW_AUTOSIZE); //处理后图像窗口
    imshow("dImage", dImage);               //显示处理后的图像

    waitKey(0); //图像显示为一帧
    return 0;
}

Демонстрация результатов средней разницы:

结果演示

Размытие по Гауссу

Прежде всего, каков принцип размытия по Гауссу?

Размытие по Гауссу звучит очень высоко, но на самом деле это очень простое приложение алгоритма, широко используемое в Android и других аспектах. Размытие по Гауссу называется размытием по Гауссу, потому что оно использует нормальное распределение в вероятности и статистике (размытие по Гауссу)) функция плотности, а именно :

正态分布(高斯分布)的密度函数

где u - среднее значение x, а σ - стандартное отклонение x. Поскольку текущая точка используется в качестве начала каждый раз, когда выполняется расчет, мы устанавливаем u равным 0, что упрощается до одномерного уравнения нормального распределение:

正态分布的一维方程

Одномерное уравнение нормального распределения представляет собой график в виде горы, чем ближе к середине, тем больше значение, чем дальше от середины, тем меньше значение.

正态分布图示

Принцип размытия по Гауссу заключается в том, чтобы сделать значение пикселя каждой точки на изображении эквивалентным среднему значению пикселя ее края, и это среднее значение является не просто средним значением, а средневзвешенным значением, то есть "центральная точка" считается источником нормального распределения, другие значения взвешиваются в соответствии со значениями нормального распределения и могут быть получены путем их сложения. Применение средневзвешенного значения ко всему изображению даст эффект размытия.Очевидно, что использовать одномерное нормальное распределение для двумерного изображения нецелесообразно, поэтому будем использовать двумерное уравнение нормального распределения, а именно:

正态分布二维函数方程

Изображение в 2D:

正态分布二维图像

Если сейчас во всем изображении 9 пикселей, центральная точка является исходной точкой, и пусть σ равно 1 (стандартное нормальное распределение):

9个像素点

Внесите его в формулу Гаусса и найдите значение каждого бита:

取值

Теперь девять значений пикселей в сумме составляют 4,8976. Поскольку сумма средневзвешенных весов должна равняться 1, каждое из девяти значений пикселей необходимо разделить на 4,8976, что дает:

加权平均值

Таким образом, значение каждого пикселя в изображении взвешивается и усредняется, а разница пикселей с окружающими пикселями становится меньше, а изображение в целом выглядит более мягким и размытым.

Затем нормально распределенные веса помещаются в ядро ​​свертки, после чего свертывается все изображение. После завершения свертки размытие по Гауссу завершено.

Что такое «свертка»?

На самом деле свертка — это самая основная операция в обработке изображений, то есть двумерная матрица A (MN) и двумерная матрица B (mn) выполняют несколько операций для создания новой двумерной матрицы C (M* N), где m и n намного меньше, чем M и N, а B называется ядром свертки (ядром), также известным как матрица фильтра или шаблон.

卷积

卷积

И фильтр (ядро свертки) делится на множество видов, один из которых является средним фильтром, значение веса центрального начала равно 0, значения окружающих элементов равны, а сумма равна 1, другой - Фильтр Гаусса, который мы используем сейчас. Фильтр Гаусса является усовершенствованной версией среднего фильтра, с той лишь разницей, что каждый элемент ядра свертки среднего фильтра одинаков, в то время как элементы ядра свертки фильтра Гаусса подчиняются распределение Гаусса. Небольшое введение в другие часто используемые фильтры:

Фильтр повышения резкости изображения

То есть на основе обнаружения края значения пикселей, полученные в результате обнаружения края, добавляются к исходному изображению, чтобы сделать край всего изображения более четким. То есть на основе ядра свертки, обнаруженного краем, добавить 1 к центру, а затем выполнить свертку изображения.

图像锐化滤波器  小型卷积核
图像锐化滤波器  大型卷积核

рельефный фильтр

Рельефный фильтр Рельефный фильтр может придать изображению эффект трехмерной тени. Просто вычтите пиксели с одной стороны от центра из пикселей с другой стороны.

浮雕滤波器  小型卷积核

浮雕滤波器  大型卷积核

О: Исходное изображение. Б: Заточка. C: Обнаружение края. Д: облегчение

滤波器

От чего зависит размытость изображения?

  • 1. Зависит от σ, которое представляет собой стандартное отклонение x. Чем больше σ, тем значение пикселя всего изображения станет более гладким, то есть более размытым, а чем меньше σ, значение пикселя всего изображения будет меняться незначительно или даже практически не меняться, что приводит к отсутствию размытия по Гауссу.

取决于σ

  • 2. В зависимости от размера ядра свертки, чем больше ядро ​​свертки, тем более очевидно, что пиксель центральной точки взвешивается окружающими пикселями (чем больше ядро, тем дальше окружающие пиксели), и изображение более размыто. .

取决于卷积核的大小

取决于卷积核的大小

код

импортировать заголовочный файл

#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#define WINDOW_NAME "【程序窗口】"
#define PI 3.1415926

using namespace cv;
using namespace std;

вызов камеры

VideoCapture video(0);
while (true)
{
   Mat frame;//视频的每一帧
   video >> frame;  //将视频写入每一帧
   cvtColor(frame,frame,COLOR_RGB2GRAY);
   cvNamedWindow("frame", WINDOW_AUTOSIZE);
   imshow("frame",frame);
   waitKey(30);
}

Размытие по Гауссу - реализация ядра свертки

Mat srcImage = imread("D:\\Desktop\\lena.jpg", 1);  //读取图片
cvtColor(srcImage, srcImage,COLOR_BGR2GRAY);  //转为灰度图像

namedWindow("srcImage", WINDOW_AUTOSIZE);  //新建窗口
imshow("srcImage", srcImage);  //显示图像
//waitKey(0);  //图像显示为一帧

//由于中型差分的原因,输出图像比原始图象少了两列
Mat dImage = Mat(srcImage.rows,srcImage.cols - 2,CV_8UC1);

//循环遍历整个图像
for (int i = 0; i < srcImage.rows; i++)
{
    for (int j = 1; j < srcImage.cols - 1; j++)
    {
        //对整型数据类型进行运算,进行中型差分
        dImage.at<uchar>(i, j - 1) = srcImage.at<uchar>(i, j + 1) - srcImage.at<uchar>(i, j - 1);
    }
}
namedWindow("dImage", WINDOW_AUTOSIZE);  //处理后图像窗口
imshow("dImage", dImage);  //显示处理后的图像

waitKey(0);  //图像显示为一帧

Mat srcImage = imread("D:\\Desktop\\lena.jpg", 1); //读取图片
cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);      //转为灰度图像
namedWindow("srcImage", WINDOW_AUTOSIZE);          //新建窗口
imshow("srcImage", srcImage);                      //显示图像

/*高斯模糊*/

//5×5卷积模板
Mat model = Mat(5, 5, CV_64FC1);
double sigma = 80;  //超参数,根据经验所得
for (int i = - 2; i <= 2 ; i++)  //进行遍历
{
    for (int j = -2; j <= 2; j++)
    {
        //正态分布
        model.at<double>(i + 2, j + 2) =
            exp(-(i * i + j * j) / (2 * sigma * sigma)) /
            (2 * PI * sigma * sigma);
    }
}

//归一化
double gaussSum = 0;
gaussSum = sum(model).val[0];  //卷积核 求和
for (int i = 0; i < model.rows; i++)
{
    for (int j = 0; j < model.cols; j++)
    {
        model.at<double>(i, j) = model.at<double>(i, j)
            / gaussSum;
    }
}

Mat dst = Mat(srcImage.rows - 4,srcImage.cols - 4,CV_8UC1);

//对整个图片进行遍历卷积
for (int i = 2; i < srcImage.rows - 2; i++)
{
    for (int j = 2; j < srcImage.cols - 2; j++)
    {
        double sum = 0;  //求和目标值
        for (int m = 0; m < model.rows; m++)
        {
            for (int n = 0; n < model.cols; n++)
            {
                sum += (double)srcImage.at<uchar>(i + m - 2, j + n - 2) * 
                    model.at<double>(m,n);  //对整个卷积核进行卷积
            }
        }
        dst.at<uchar>(i - 2, j - 2) = (uchar)sum;  //结果赋值到dst图像当中
    }
}
namedWindow("gaussBlur", WINDOW_AUTOSIZE);
imshow("gaussBlur", dst);
waitKey(0); //图像显示为一帧

Вызов библиотечной функции Gaussian fuzzy — реализация одной строки кода

Mat dst = srcImage.clone();
//一行代码高斯模糊
GaussianBlur(srcImage, dst, Size(17, 17), 180);
namedWindow("gaussBlur", WINDOW_AUTOSIZE);
imshow("gaussBlur", dst);
waitKey(0); //图像显示为一帧

Демонстрация результата размытия по Гауссу (ядро свертки 5 × 5 + сигма = 80):

高斯模糊结果演示

Ссылаться на

Обработка изображений Android — принцип и реализация размытия по Гауссу Что такое принцип размытия по Гауссу и как его реализовать в интерфейсе? Некоторые знания о размытии по Гауссу и сверточной фильтрации изображений