
- •Задание
- •Выполнение задание 1: Выполните сглаживание изображений с помощью различных фильтров. Сравните результаты численно и количественно.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 2: Изучите морфологические операции над изображениями, выполните фильтрацию тонких линий с помощью морфологических фильтров.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 3: Работа с подобластями. Измените яркость и контраст заданной части изображения. Впишите в одно изображение другое меньшего размера.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 4: Постройте гистограмму изображения. Примените эквализацию гистограммы.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 5: Используйте преобразование Хау для поиска прямых на изображении.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 6: По найденным прямым постройте аффинное преобразование и выровняйте изображение.
- •Фрагмент кода выполнения
- •Список используемых источников
Результаты:
Рис. 9. Построение гистограммы по 3-х канальному изображению
Рис. 6. Результат эквализации гистограммы исходного изображения.
Фрагмент кода выполнения
//========================================================================================
cv::namedWindow("Histogram", CV_WINDOW_AUTOSIZE);
cv::namedWindow("Equalization", CV_WINDOW_AUTOSIZE);
cv::Mat bgrChannels[3];
cv::Mat bHist, gHist, rHist;
// количество бинов гистограммы
int histSize = 256;
// интервал изменения значений бинов
float range[] = { 0.0f, 256.0f };
const float *histRange = { range };
// равномерное распределение интервала по бинам
bool uniform = true;
// запрет очищения перед вычислением гистограммы
bool accumulate = false;
// размеры для отображения гистограммы
int histWidth = 512, histHeight = 400;
// количество пикселей на бин
int binWidth = cvRound((double)histWidth / histSize);
// выделение каналов изображения
split(dst, bgrChannels);
calcHist(&bgrChannels[0], 1, 0, cv::Mat(), bHist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgrChannels[1], 1, 0, cv::Mat(), gHist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgrChannels[2], 1, 0, cv::Mat(), rHist, 1, &histSize, &histRange, uniform, accumulate);
// построение гистограммы
cv::Mat histImage = cv::Mat(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));
// нормализация гистограмм в соответствии с размером окна для отображения
normalize(bHist, bHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());
normalize(gHist, gHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());
normalize(rHist, rHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());
// отрисовка ломаных
for (int i = 1; i < histSize; i++)
{
line(histImage, cv::Point(binWidth * (i - 1),
histHeight - cvRound(bHist.at<float>(i - 1))),
cv::Point(binWidth * i,
histHeight - cvRound(bHist.at<float>(i))),
cv::Scalar(255, 0, 0), 2, 8, 0);
line(histImage, cv::Point(binWidth * (i - 1),
histHeight - cvRound(gHist.at<float>(i - 1))),
cv::Point(binWidth * i,
histHeight - cvRound(gHist.at<float>(i))),
cv::Scalar(0, 255, 0), 2, 8, 0);
line(histImage, cv::Point(binWidth * (i - 1),
histHeight - cvRound(rHist.at<float>(i - 1))),
cv::Point(binWidth * i,
histHeight - cvRound(rHist.at<float>(i))),
cv::Scalar(0, 0, 255), 2, 8, 0);
}
// отображение исходного изображения и гистограмм
cv::imshow("Histogram", histImage);
// преобразование в оттенки серого
cv::cvtColor(src, dst, CV_RGB2GRAY);
// выравнивание гистограммы
equalizeHist(dst, dst);
cv::imshow("Equalization", dst);
cv::waitKey();
//========================================================================================
Задание 5: Используйте преобразование Хау для поиска прямых на изображении.
В OpenCV есть функция, реализующая преобразование Хафа для поиска линий.
CVAPI(CvSeq*) cvHoughLines2( CvArr* image, void* line_storage, int method,
double rho, double theta, int threshold,
doubleparam1CV_DEFAULT(0),doubleparam2CV_DEFAULT(0));— нахождение линий на двоичном изображении, используя преобразование Хафа
image — 8-битное двоичное изображение (в случае вероятностного метода изображение будет модифицироваться)
line_storage — хранилище памяти для сохранения найденных линий (можно использовать матрицу 1xЧисло_линий CvMat)
method — метод:
#define CV_HOUGH_STANDARD 0
#define CV_HOUGH_PROBABILISTIC 1
#define CV_HOUGH_MULTI_SCALE 2
CV_HOUGH_STANDARD — классический вариант трансформации Хафа. Каждая линия представляется двумя числами типа float (rho, theta),
где rho — дистанция между точкой (0,0) и линией,
theta — угол между осью x и нормалью к линии (т.е. матрица должна иметь тип of CV_32FC2)
CV_HOUGH_PROBABILISTIC— вероятностный метод трансформации Хафа (более эффективен с случае изображений с несколькими длинными линейными сегментами). Возвращает сегменты линии, которые представляются точками начала и конца (т.е. матрица должна иметь тип of CV_32SC4)
CV_HOUGH_MULTI_SCALE— масштабный вариант классической трансформации Хафа. Линии представлены так же, как и в CV_HOUGH_STANDARD
Вероятностное преобразование Хафа (Probabilistic Hough Transform) заключается в том, что для нахождения объекта достаточно провести преобразование Хафа только для части (a) точек исходного изображения, 0% <= a <= 100%. То есть сначала провести выделение «контрольных» точек с изображения, и для него провести преобразование Хафа.
rho — разрешение по дистанции
theta — разрешение по углу (в радианах)
threshold — пороговый параметр. Линия возвращается, если аккумулирующий параметр больше порогового значения.
param1 — первый параметр (в зависимости от метода трансфрмации:
CV_HOUGH_STANDARD — 0 — не используется
CV_HOUGH_PROBABILISTIC — минимальная длина линии
CV_HOUGH_MULTI_SCALE — делитель разрешения по дистанции (rho/param1))
param2 — второй параметр (в зависимости от метода трансфрмации:
CV_HOUGH_STANDARD — 0 — не используется
CV_HOUGH_PROBABILISTIC — максимальный промежуток между сегментами линии, лежащими на одной линии, чтобы считать их одним сегментом (объединить их вместе)
CV_HOUGH_MULTI_SCALE — делитель разрешения по углу (theta/param1))
Если line_storage — указатель на хранилище памяти, то функция вернёт указатель на первый элемент последовательности, содержащей найденные линии.