使用python opencv 实现图像边缘检测

3.7 开发日记

心心念念的产学研终于在中期答辩之后开始了- -

之前都对于自己的产学研没有一个计划,也没有一丝头绪,经过中期答辩的准备终于有了一个大致的方向和要学习努力的目标,所以打算更改之前只coding不记录的作风,对于产学研遇到的问题和开发路径都做一个较为详述的记录

那就让我们愉快的开始吧b( ̄▽ ̄)d

边缘检测

我们都知道OCR算法是基于图像的文字识别算法,和边缘检测有和什么关系? 我们在进行文本检测的时候,并不是上来就直接对于文本进行检测,首先要对图片进行预处理,先将无用的或者对检测有影响的因素降到最小,才可以使我们的检测效率提高一个档次

第一步要进行的操作就是边缘检测了,边缘检测,顾名思义就是对于文本对象的边缘进行标注

代码在下方

from transform import four_point_transform
import numpy as np
import argparse
import cv2
import imutils

# ap = argparse.ArgumentParser()
# ap.add_argument('-i','--image',required=True,help="Path to image file")
#
# args = vars(ap.parse_args())

#flag: 获取了图像路径

image = cv2.imread('image/30.png')
ratio = image.shape[0] /500.0
orig = image.copy()
image = imutils.resize(image,height=500)

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #灰度图像
gray = cv2.GaussianBlur(gray,(5,5),0)          #高斯模糊
edged = cv2.Canny(gray,75,200)                  #边缘检测



# flag : Test1 = BLOCK
print("STEP 1 Edge Detection")
cv2.imshow("Image",image)
cv2.imshow("Edge",edged)
cv2.waitKey(0)
cv2.destroyAllWindows()

首先引入必要的包

  1. numpy 是运算的必须包
  2. argparse 是方便python的命令行操作
  3. cv2 是openCV图像处理库
  4. imutils 是对于图像进行裁剪和切割的库

为什么第一行有一个four_point_transform??这个并不是什么库,而是我们自己实现的一个旋转函数,通过转递图像和边缘矩形的四个点,就可以通过透视转换将不是正视投影的文本图片转化为正视角投影

同样附上这个函数得代码

ps: 可以在同一个文件夹下面创建一个新的transform.py 的文件

import numpy as np
import cv2

def order_points(pts):
    #四个点按照左上、右上、右下、左下

    #pts 是四个点的列表
    rect = np.zeros((4,2),dtype="float32")

    s = pts.sum(axis=1)
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]

    diff = np.diff(pts,axis = 1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]

    return rect

def four_point_transform(image, pts):  #image 为需要透视变换的图像  pts为四个点

    rect = order_points(pts)  #四点排序
    (tl, tr, br, bl) = rect   #方便计算

    widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
    widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
    maxWidth = max(int(widthA), int(widthB))

    heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
    heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
    maxHeight = max(int(heightA), int(heightB))


    dst = np.array([
        [0, 0],
        [maxWidth - 1, 0],
        [maxWidth - 1, maxHeight - 1],
        [0, maxHeight - 1]], dtype = "float32")

    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))

    return warped

具体的函数实现以及每一行的意义已经在四点透视变换网址中说的很详细了,要了解细节可以查阅

总之这个函数就是通过让你将边缘的四个点传入,然后对于文本(带有偏移量的或旋转的文本)进行一个截取与透视变换

回到我的第一个代码块

首先

ap = argparse.ArgumentParser()
ap.add_argument('-i','--image',required=True,help="Path to image file")

args = vars(ap.parse_args())

这三行注册-i 命令行参数,意义为输入需要进行处理的图片路径,这在之后的整合会很有用

最关键的就是这三句

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #灰度图像
gray = cv2.GaussianBlur(gray,(5,5),0)          #高斯模糊
edged = cv2.Canny(gray,75,200)                  #边缘检测
  1. 将图像转为灰度图像
  2. 将图像进行高斯模糊
  3. 通过模糊之后的图像进行边缘检测

让我们来看看效果

pyhon   transform.py -i image/1.png
37_1.png
37_2.png

效果还不错

你可能感兴趣的:(使用python opencv 实现图像边缘检测)