zoukankan      html  css  js  c++  java
  • 《opencv学习》 之 几何变换


    图像平移:

          1.不改变图像大小

           2.改变图像大小

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

     不改变大小的平移
    1
    void imageTranslation1(Mat& src, Mat& dst, const int& xoffset, const int& yoffset) 2 { 3 cvtColor(src, src, CV_BGR2GRAY); 4 const int height = src.rows; 5 const int width = src.cols; 6 dst.create(src.size(), src.type()); 7 dst.setTo(0); 8 for (size_t i = 0; i < height; i++) 9 { 10 for (size_t j = 0; j < width; j++) 11 { 12 int x = j - xoffset;//列x=j 13 int y = i - yoffset;//行y=i 14 if (x >= 0 && y >= 0 && x <= width && y <= height) 15 { 16 dst.at<uchar>(i, j) = src.at<uchar>(y, x); 17 } 18 } 19 } 20 }
    //----改变图像大小的平移
    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(0);
        const int height = dst.rows;
        const int width  = dst.cols;
        for (size_t i = 0; i < height; i++)
        {
            for (size_t j = 0; j < width; j++)
            {
                int x = j - xoffset;//列x=j
                int y = i - yoffset;//行y=i
                if (x >= 0 && y >= 0 && x <= width && y <= height)
                {
                    dst.at<uchar>(i, j) = src.at<uchar>(y, x);
                }
            }
        }
    }


    图像的缩放:

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

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

     等间隔
    1
    void imageReduction1(Mat& src, Mat& dst, float kx, float ky) 2 { 3 4 cvtColor(src, src, CV_BGR2GRAY); 5 dst.create(Size(cvRound(src.cols*kx), cvRound(src.rows*ky)), src.type()); 6 const int height = dst.rows; 7 const int width = dst.cols; 8 dst.setTo(0); 9 for (size_t i = 0; i < height; i++) 10 { 11 for (size_t j = 0; j < width; j++) 12 { 13 int y = static_cast<int>((i + 1) / kx); 14 int x = static_cast<int>((j + 1) / ky); 15 dst.at<uchar>(i, j) = src.at<uchar>(y, x); 16 } 17 } 18 }
     区域子块
    1
    void imageReduction2(Mat& src, Mat& dst, float kx, float ky) 2 { 3 4 cvtColor(src, src, CV_BGR2GRAY); 5 dst.create(cvRound(src.rows*ky), cvRound(src.cols*kx), src.type()); 6 int height = src.rows; 7 int width = src.cols; 8 dst.setTo(0); 9 const int dx = cvRound(1 / kx); 10 const int dy = cvRound(1 / ky); 11 for (size_t i = 0, x = 0; i < height; i += dy, x++) 12 { 13 for (size_t j = 0, y = 0; j < width; j += dx, y++) 14 { 15 dst.at<uchar>(x,y) = areaAverage(src, Point(j, i), Point(j + dx, i + dy)); 16 } 17 } 18 19 } 20 //--------求一个矩形区域像素平均值 21 uchar areaAverage(Mat& src, Point& leftPoint, Point& rightPoint) 22 { 23 Mat roi = src(Rect(leftPoint, rightPoint)); 24 const int height = roi.rows; 25 const int width = roi.cols; 26 float sumPix = 0; 27 for (size_t i = 0; i < height; i++) 28 { 29 for (size_t j = 0; j < width; j++) 30 { 31 sumPix += (roi.at<uchar>(i, j) / (height*width)); 32 } 33 } 34 return sumPix; 35 }

     图像旋转

           没怎么看懂书上的代码

  • 相关阅读:
    ButterKnife的使用以及不能自动生成代码问题的解决
    Android事件传递机制
    Java中四种引用类型
    Swiper
    table合并单元格 colspan(跨列)和rowspan(跨行)
    常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全
    解决firefox、chrome不兼容cursor:hand 设置鼠标为手型的方法
    js 验证表单 js提交验证类
    怎么解决浏览器兼容性问题
    JavaScript作用域链
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/6860032.html
Copyright © 2011-2022 走看看