opencv图像校正

opencv图片矫正
基本操作:图像的翻转(镜像)、平移、旋转、仿射与透视变换(OPENCV C++)
常用图像函数:几个常见的cv函数,cvtcolor、gaussianblur、canny等等
旋转:霍夫线可以实现
仿射:三个点
透视:四个点

自动化透视矫正图像流程:
灰度化二值化
形态学去除噪点
获取轮廓
检测直线
计算直线交点
获取四个透视顶点
透视变换

本项目重点:旋转、透视变换
本项目难点:做透视变换时,由于照片中的表格可能并不完整,提取透视点比较困难
解决方案:拓展线取交点或依文字部分确定框线获取透视顶点(必有检查步骤检查上传的照片完整度,确保所需文字都齐全)
重要方法

轮廓提取技术
霍夫变换知识
ROI感兴趣区域知识

HoughLines

引用自霍夫线介绍

cv2.HoughLines()
	dst:   输出图像. 它应该是个灰度图 (但事实上是个二值化图)
	lines: 储存着检测到的直线的参数对 (r,\theta) 的容器 
	rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
	theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1(即CV_PI/180)
	threshold:    设置阈值: 一条直线所需最少的的曲线交点
	srn and stn:  参数默认为0
        return:返回的是一个包含rho和theta的数组,[rho,theta]
cv2.HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 )
	dst:    输出图像. 它应该是个灰度图 (但事实上是个二值化图) 
	lines:  储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器
	rho :   参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
	theta:  参数极角 \theta 以弧度为单位的分辨率. 我们使用 1(即CV_PI/180)
	threshold:    设置阈值: 一条直线所需最少的的曲线交点。超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。
	minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
	maxLineGap:   能被认为在一条直线上的两点的最大距离。
        return:返回的是含有一条直线的起始点和终点坐标[x1,y1,x2,y2]

注意事项:

  • cv2.imread不支持中文路径,英文路径可以;但若要读取中文路径,做如下处理image = cv2.imdecode(np.fromfile("D:/斜角度2.jpg", dtype=np.uint8), -1)
  • cv2.resize/imutils.resize 依选定参数重新设定长宽 扩缩图片,resize(img,(x, y))
  • cv2.canny函数
void cvCanny(

  const CvArr* image,

  CvArr* edges,

  double threshold1,double threshold2,

  int aperture_size=3

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。

第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵

findContours函数

引用自findContours函数介绍

findContours( InputOutputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset=Point());

输出contours, hierarchy=findContours()
contours为轮廓点信息,hierarchy为轮廓结构信息
inputarray InputArray类的作用
[不能声明一个InputArray类]

(http://blog.sina.com.cn/s/blog_59fabe030101hvow.html)
1第一个参数image:图像->二值图像(一般是边缘处理过的二值图像)
2第二个参数contours:contours,定义为“vector contours”,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。 有多少轮廓,向量contours就有多少元素
contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数,不同轮廓的像素点个数大有不同,
contours<-许多轮廓点<-许多像素点

3第三个参数hierarchy:定义为“vector hierarchy”,先来看一下Vec4i的定义: typedef Vec Vec4i; Vec4i是Vec的别名,定义了一个“向量内每一个元素包含了4个int型变量”的向量。 所以从定义上看,hierarchy也是一个向量,向量内每个元素保存了一个包含4个int整型的数组。 向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个 轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为 默认值-1。
4第四个参数 int mode:
opencv图像校正_第1张图片
5第五个参数:int method:
opencv图像校正_第2张图片
6第六个参数:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!

  • cv2.contourArea(cnt, True) # 计算轮廓的面积
    参数说明:cnt为输入的单个轮廓值
  • cv2.arcLength(cnt, True) # 计算轮廓的周长
    参数说明:cnt为输入的单个轮廓值
  • cv2.aprroxPolyDP(cnt, epsilon, True) # 用于获得轮廓的近似值,使用cv2.drawCountors进行画图操作
    参数说明:cnt为输入的轮廓值, epsilon为阈值T,通常使用轮廓的周长作为阈值,True表示的是轮廓是闭合的
  • drawcontours?or?aprroxPolyDP:drawcontours填充轮廓点 approxPolyDP画出近似曲线!!!
  • drawContours( dstImage, contours, index, color, 1, 8,hierarchy )
  • approxPolyDP(Mat(contours0[k]), contours[k], 0.1, true)
  • 输入的参数也有不同 drawcontours需要原始图片信息

你可能感兴趣的:(python基础与实践,opencv,计算机视觉,人工智能)