计算机视觉作业
代码里有详细的注释,就不多过于解释了。
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步