Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
laba1_1_Shleev_Bliznuk.docx
Скачиваний:
22
Добавлен:
26.03.2016
Размер:
947.3 Кб
Скачать

Результаты:

Рис. 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 — указатель на хранилище памяти, то функция вернёт указатель на первый элемент последовательности, содержащей найденные линии.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]