- •Задание
- •Выполнение задание 1: Выполните сглаживание изображений с помощью различных фильтров. Сравните результаты численно и количественно.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 2: Изучите морфологические операции над изображениями, выполните фильтрацию тонких линий с помощью морфологических фильтров.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 3: Работа с подобластями. Измените яркость и контраст заданной части изображения. Впишите в одно изображение другое меньшего размера.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 4: Постройте гистограмму изображения. Примените эквализацию гистограммы.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 5: Используйте преобразование Хау для поиска прямых на изображении.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 6: По найденным прямым постройте аффинное преобразование и выровняйте изображение.
- •Фрагмент кода выполнения
- •Список используемых источников
Результаты:
Рис. 10-11. Преобразование Хау, для нахождения прямых.
Фрагмент кода выполнения
//========================================================================================
cv::namedWindow("Detected Lines", CV_WINDOW_AUTOSIZE);
src = cv::imread("kniga.png", 1); // загружаем изображение
if (!src.data) return -1; // проверка
cv::Mat cdst;
Canny(src, dst, 50, 200, 3);
cvtColor(dst, cdst, CV_GRAY2BGR);
#if 0
vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI / 180, 100, 0, 0);
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
line(cdst, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);
}
#else
std::vector<cv::Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI / 180, 50, 50, 10);
for (size_t i = 0; i < lines.size(); i++)
{
cv::Vec4i l = lines[i];
line(cdst, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(0, 0, 255), 3, CV_AA);
}
#endif
imshow("Detected Lines", cdst);
cv::waitKey();
cvDestroyWindow("Detected Lines");
// ==========================================================
Задание 6: По найденным прямым постройте аффинное преобразование и выровняйте изображение.
Преобразование плоскости (изображения) называется аффинным, если оно взаимно однозначно и образом любой прямой является прямая.
Взаимно однозначное преобразование, переводит каждую точку плоскости(изображения) I в другую точку плоскости(изображения) I', таким образом, что каждой точке I соответствует какая-то точка I'.
Примеры аффинных преобразований:
* обычное движение — фактически движение является параллельным переносом;
* повороты;
* растяжения или сжатия относительно прямой.
Для осуществления аффинных преобразований, обычно используется матрица перехода.
ВOpenCV аффинные преобразования осуществляются функциейcvWarpAffine():
CVAPI(void) cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS),
CvScalar fillval CV_DEFAULT(cvScalarAll(0)) ) — применение аффинной трансформации
src — исходное изображение
dst — целевое изображение
map_matrix — матрица трансформации 2х3
flags — комбинация флагов метода интерполяции и флагов:
#define CV_WARP_FILL_OUTLIERS 8
#define CV_WARP_INVERSE_MAP 16
CV_WARP_FILL_OUTLIERS — заполнить все пиксели целевого изображения (если пиксели отсутствуют на исходном изображени используются fillval)
CV_WARP_INVERSE_MAP — используется обратная трансформация из dst в src
fillval — значение для заполнения пикселей вне исходного изображения dst(x',y') =src(x;y).
Важным параметром функции cvWarpAffine() является map_matrix — матрица трансформации.
Сгенерировать эту матрицу можно с помощью двух методов —cvGetAffineTransform() илиcv2DRotationMatrix():
CVAPI(CvMat*)cvGetAffineTransform(constCvPoint2D32f*src,constCvPoint2D32f*dst,CvMat*map_matrix);— рассчёт матрицы аффинной трансформации из трёх пар точек.
src — 3 координаты исходного изображения;
dst — 3 соотносящихся координаты целевого изображения;
map_matrix — получаемая матрица трансформации 2х3.
CVAPI(CvMat*) cv2DRotationMatrix( CvPoint2D32f center, double angle,
doublescale,CvMat*map_matrix);— рассчитывает аффинную матрицу 2D-вращения;
center — центр вращения на исходном изображении;
angle — угол поворота в гардусах (положительная величина означает вращение против часовой стрелки);
scale — масштаб;
map_matrix — указатель на получаемую матрицу 2х3.
a b (1 - a)*center.x - b*center.y
b-1 a center.x - (1 - a)*center.y, где a = scale - cos(angle), b = scale - sin(angle)
Рис. 12. Результат аффинного преобразования.