《opencv学习》 之 几何变换


图像平移:

      1.不改变图像大小

       2.改变图像大小

编程按照目标图像的角度去编写

 不改变大小的平移
1 void imageTranslation1(Mat& src, Mat& dst, const int& xoffset, const int& yoffset)
{
cvtColor(src, src, CV_BGR2GRAY);
const int height = src.rows;
const int width = src.cols;
dst.create(src.size(), src.type());
dst.setTo();
for (size_t i = ; i < height; i++)
{
for (size_t j = ; j < width; j++)
{
int x = j - xoffset;//列x=j
int y = i - yoffset;//行y=i
if (x >= && y >= && x <= width && y <= height)
{
dst.at<uchar>(i, j) = src.at<uchar>(y, x);
}
}
}
}
//----改变图像大小的平移
void imageTranslation2(Mat& src, Mat& dst, const int& xoffset, const int& yoffset)
{
cvtColor(src, src, CV_BGR2GRAY);
dst.create(Size(src.cols + abs(xoffset), src.rows + abs(yoffset)), src.type());
dst.setTo();
const int height = dst.rows;
const int width = dst.cols;
for (size_t i = ; i < height; i++)
{
for (size_t j = ; j < width; j++)
{
int x = j - xoffset;//列x=j
int y = i - yoffset;//行y=i
if (x >= && y >= && x <= width && y <= height)
{
dst.at<uchar>(i, j) = src.at<uchar>(y, x);
}
}
}
}

《opencv学习》 之 几何变换《opencv学习》 之 几何变换

《opencv学习》 之 几何变换


图像的缩放:

          1.基于等间隔提取图像缩放

        2.基于区域子块提取图像缩放

 等间隔
1 void imageReduction1(Mat& src, Mat& dst, float kx, float ky)
{ cvtColor(src, src, CV_BGR2GRAY);
dst.create(Size(cvRound(src.cols*kx), cvRound(src.rows*ky)), src.type());
const int height = dst.rows;
const int width = dst.cols;
dst.setTo();
for (size_t i = ; i < height; i++)
{
for (size_t j = ; j < width; j++)
{
int y = static_cast<int>((i + ) / kx);
int x = static_cast<int>((j + ) / ky);
dst.at<uchar>(i, j) = src.at<uchar>(y, x);
}
}
}
 区域子块
1 void imageReduction2(Mat& src, Mat& dst, float kx, float ky)
{ cvtColor(src, src, CV_BGR2GRAY);
dst.create(cvRound(src.rows*ky), cvRound(src.cols*kx), src.type());
int height = src.rows;
int width = src.cols;
dst.setTo();
const int dx = cvRound( / kx);
const int dy = cvRound( / ky);
for (size_t i = , x = ; i < height; i += dy, x++)
{
for (size_t j = , y = ; j < width; j += dx, y++)
{
dst.at<uchar>(x,y) = areaAverage(src, Point(j, i), Point(j + dx, i + dy));
}
} }
//--------求一个矩形区域像素平均值
uchar areaAverage(Mat& src, Point& leftPoint, Point& rightPoint)
{
Mat roi = src(Rect(leftPoint, rightPoint));
const int height = roi.rows;
const int width = roi.cols;
float sumPix = ;
for (size_t i = ; i < height; i++)
{
for (size_t j = ; j < width; j++)
{
sumPix += (roi.at<uchar>(i, j) / (height*width));
}
}
return sumPix;
}

《opencv学习》 之 几何变换《opencv学习》 之 几何变换《opencv学习》 之 几何变换

 图像旋转

       没怎么看懂书上的代码

上一篇:DAO设计模式


下一篇:java开发中几种常见的线程池