Welcome to 发呆鱼.|

发呆鱼

园龄:3年4个月粉丝:1关注:0

计算机视觉作业

代码里有详细的注释,就不多过于解释了。

import cv2
import correct as Correct
import ExtractCharacter as EC
import  DetectionStamp as De
'''
Created on 2020年10月14日
矫正图片,提取印章,识别第一行文字
@author: ding00
'''
#原始图像
orimg = cv2.imread("30001.JPG")

def imgshow(img):
    '''
    显示图片
    :param img:
    :return:
    '''
    cv2.namedWindow("orimg", cv2.WINDOW_FREERATIO)
    cv2.imshow("orimg", orimg)

    cv2.namedWindow("img", cv2.WINDOW_FREERATIO)
    cv2.imshow("img", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()



def correctimg():
    '''
    矫正图片
    :return:
    '''
    cor=Correct.Correct()
    #获取已经矫正的图像
    img=cor.start(orimg)

    #画出标定线
    cv2.putText(img,"vertical line",(165,200),cv2.FONT_HERSHEY_SIMPLEX,2.5,(0,0,255),5)
    cv2.putText(img,"horizontal line", (1500, 290), cv2.FONT_HERSHEY_SIMPLEX, 2.5, (0, 255, 0), 5)
    cv2.line(img,(0,300),(2550,300),(0,255,0),10)
    cv2.line(img,(162,0),(162,3500),(0,0,255),10)
    imgshow(img)



def getStamp():
    '''
    矫正图片
    :return:
    '''
    det=De.DetectionStamp()
    img=det.start(img=orimg,bool=True)
    imgshow(img)

def getworld():
    '''
    获取文字
    :return:
    '''
    ect=EC.EetractCharacter()
    cor = Correct.Correct()
    lines=cor.getlines(img=orimg)
    text,img=ect.start(orimg=orimg,lines=lines)
    print("识别文字:",text)
    imgshow(img)




if __name__=='__main__':

    getworld()  #识别文字
    #correctimg() #矫正图片
    #getStamp()  #获取印章

下面是矫正图片的代码

import cv2
import numpy as np
'''
Created on 2020年10月14日
对图片进形矫正
cv2.HoughLinesP对直线进行提取
通过平均计算直线平均斜率来矫正图片
@author: ding00
'''


class Correct():

    def __init__(self):
        pass;


    def getlines(self,img):
        '''
        获取图片直线
        :param img:图片数据(type=numpy
        :return:直线列表
        '''
        #转换为灰度图片
        cvt= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        #边缘检测
        can = cv2.Canny(cvt, threshold1=50, threshold2=150)
        #直线检测
        lines = cv2.HoughLinesP(can, 1, np.pi / 180, 100, minLineLength=500, maxLineGap=20)

        return lines

    def getangle(self,lines):
        '''
        根据直线,计算角度
        :param lines: 检测直线列表
        :return: 角度
        '''
        sum=0
        count=0
        num=0
        for line in lines:
            num=num+1
            for x1, y1, x2, y2 in line:
                #仅计算倾斜的直线
                if x1!=x2 and y1!=y2:
                    #计算斜率
                    k = (y2 - y1) / (x2 - x1)
                    #计算角度
                    result = np.arctan(k) * 57.29577
                    if result >-20 and result <20:
                        sum = sum + result;
                        count = count + 1;
        #如果倾斜的直线不超过1/5条,则认为不需要旋转
        if count<len(lines)/5:
            s=0
        else:
            s=(sum)/count
        return  s

    def rotateimg(self,img,angle):
        '''
        旋转图片
        :param img: 图片
        :param angle: 角度
        :return: 返回图片
        '''
        #图片尺寸
        (height, width) = img.shape[:2]
        #旋转核,旋转点:图片中心点。缩放比例:1
        matRotate = cv2.getRotationMatrix2D((height * 0.5, width * 0.5), angle, 1)
        #进行旋转,旁边补白色
        dst = cv2.warpAffine(img, matRotate, (width, height), borderValue=(255, 255, 255))
        return dst


    def start(self,img):
        '''
        开始执行
        :param img: 传入图片
        :return: 返回矫正图片
        '''
        lines=self.getlines(img=img)
        angle=self.getangle(lines=lines)
        dst=self.rotateimg(img=img,angle=angle)

        return dst

下面是提取印章的代码

import cv2
import numpy as np
'''
Created on 2020年10月14日
检测红色盖章
因为印章是红色的,故利用掩模的方式获取所需印章
@author: ding00
'''
class DetectionStamp():

    def __init__(self):
        pass

    def start(self,img,bool):
        '''
        获取图像中红色区域
        :param img: 原始图像
        :param bool: true保留红色区域(false去除红色区域
        :return: 图像
        '''
        # BGR转HSV
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        low_hsv = np.array([150, 103, 100])
        high_hsv = np.array([180, 255, 255])
        # 提取掩膜
        mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
        if bool==True:
            index1 = mask == 255
        else:
            index1 = mask != 255

        dst = np.zeros(img.shape, np.uint8)
        dst[:, :] = (255, 255, 255)
        dst[index1] = img[index1]  # (0,0,255

        return dst

下面是识别第一行文字的代码

import pytesseract
import cv2
import numpy as np
'''
Created on 2020年10月14日
识别第一行文字
使用ocr识别图像
利用掩模的方式获取要识别的图像
@author: ding00
'''


class EetractCharacter():
    def __init__(self):
        pass


    def getpoint(self,lines):
        '''
        获取要识别区域的点位
        :param lines: 识别图片中的线
        :return: 四个点(type=list
        '''
        list = None
        min = [0, 0, 0, 0]
        a = 3000
        #获取最上方的直线
        for line in lines:
            for x1, y1, x2, y2 in line:
                #获取y最小且大于100的横线
                if y1 < a and y1 > 100 and abs(x2-x1)>abs(y2-y1):
                    a = y1
                    min[0] = x1
                    min[1] = y1
                    min[2] = x2
                    min[3] = y2
        #计算k和b
        k = (min[3] - min[1]) / (min[2] - min[0])
        b = min[1] - k * min[0]
        #四个点
        list = np.array([[(0, b), (2550, 2550 * k + b), (2550, 2550 * k + b + 150),(0, b + 150)]],dtype=np.int32)

        return list




    def getarea(self,orimg,list):
        '''
        获取要识别区域图形
        :param orimg: 原始图像
        :param list: 需要获取的四个点位
        :return: 返回需要识别的图像
        '''
        #创建与图像大小一致的图像(全0,黑色)
        mask = np.zeros(orimg.shape,dtype=np.uint8)
        #颜色全白(255)
        ignore_mask_color = (255,) * orimg.shape[2]
        # 创建mask层,获取掩模
        cv2.fillPoly(mask, list, ignore_mask_color)
        #与操作,获取需要图像
        mask_img = cv2.bitwise_and(orimg, mask)
        return mask_img


    def Orcimg(self,img):
        '''
        识别文字
        :param img: 要识别的区域
        :return:
        '''
        import DetectionStamp as De
        import correct as Correct
        det = De.DetectionStamp()
        cor = Correct.Correct()
        #去除红色印章
        img=det.start(img=img,bool=False)
        # 对图片矫正
        img = cor.start(img)
        # 识别文字
        text = pytesseract.image_to_string((img), lang='chi_sim')
        return text,img


    def start(self,orimg,lines):
        '''
        执行操作
        :param orimg: 原始图像
        :param lines: 图像上已经检测的线
        :return: 识别的文字和识别的区域
        '''
        point=self.getpoint(lines=lines)
        img=self.getarea(orimg=orimg,list=point)
        text,img=self.Orcimg(img=img)
        return text,img

import cv2
import numpy as np


class HoughCircles():

    def houghcircles(self,img):
        '''
        霍夫变换检测圆形
        :param img:
        :return:
        '''
        img = cv2.medianBlur(img, 5)
        cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
        circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=200, maxRadius=220)
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            # draw the outer circle
            cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 10)
            # draw the center of the circle
            cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 30)
        return  cimg




import cv2
import correct as Correct
import numpy as np
import pytesseract

image = cv2.imread('30001.JPG', 1)
cor = Correct.Correct()
# 获取已经矫正的图像
image = cor.start(image)
# 灰度图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
# ret,binary = cv2.threshold(~gray, 127, 255, cv2.THRESH_BINARY)


rows, cols = binary.shape
scale = 30
# 识别横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (cols // scale, 1))
eroded = cv2.erode(binary, kernel, iterations=1)
# cv2.imshow("Eroded Image",eroded)
dilatedcol = cv2.dilate(eroded, kernel, iterations=1)


# 识别竖线
scale = 20
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, rows // scale))
eroded = cv2.erode(binary, kernel, iterations=1)
dilatedrow = cv2.dilate(eroded, kernel, iterations=1)


# 与运算
bitwiseAnd = cv2.bitwise_and(dilatedcol, dilatedrow)



# 标识表格
merge = cv2.add(dilatedcol, dilatedrow)
cv2.namedWindow("表格整体展示:", cv2.WINDOW_FREERATIO)
cv2.imshow("表格整体展示:", merge)
cv2.waitKey(0)


本文作者:发呆鱼

本文链接:https://www.cnblogs.com/dyiblog/articles/15929781.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   发呆鱼  阅读(51)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起