通过图像的特征运行opencv与numpy进行画图与图像的处理
本实例程序是处理图像的点坐标
import cv2 as cv
import numpy as np
import pandas as pd
import re
import datetime
def create_img(color=(255,255,255)):
img = np.zeros([1024,1024,3],np.uint8) #多通道
img[:,:,:] = np.ones([1024,1024,3])*color
# img[500,500,0] = 0
cv.imwrite("new.png",img)
return img
def datama(img):
data = pd.read_csv("****************",sep="\s+",skiprows=82,names=["loc","bin","bool"])
# print(data)
databool = data[(data['bool']==1)]
# print(databool)
databool_list = databool['loc'].tolist()
# print(databool_list)
for i in range(len(databool_list)):
# print(re.findall(r"^[A-Za-z]+$",databool_list[i]))
bool_list = re.split(r"X|Y",databool_list[i])
# bool_list = bool_list.remove('')
# bool_list = list(map(int, bool_list))
x = int(bool_list[1])
y = int(bool_list[2])
if x > 0:
x += 512
elif x < 0:
x -= 512
else:
x=512
if y > 0:
y += 512
elif y < 0:
y -= 512
else:
y=512
img[x,y,:] = (0,0,0)
cv.imwrite("ori.png",img)
return img,data
def NGdata(img,color=(0,0,255)):
data = pd.read_csv("****************",sep="\s+",skiprows=82,names=["loc","bin","bool"])
# print(data)
databin = data[(data['bin']=='****************')|(data['bin']=='****************')]
# databin.to_csv('binng.csv')
databin_list = databin['loc'].tolist()
# print(databin_list)
for i in range(len(databin_list)):
# print(re.findall(r"^[A-Za-z]+$",databin_list[i]))
bool_list = re.split(r"X|Y",databin_list[i])
# bool_list = bool_list.remove('')
# bool_list = list(map(int, bool_list))
x = int(bool_list[1])
y = int(bool_list[2])
if x > 0:
x += 512
elif x < 0:
x -= 512
else:
x=512
if y > 0:
y += 512
elif y < 0:
y -= 512
else:
y=512
img[x,y,:] = color
# cv.circle(img, (x, y),1,(0,0,255))
cv.imwrite("ng0.png",img)
return img
def hough(img):
# img = cv.imread('ng.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
cv.imwrite('edge.png',edges)
lines = cv.HoughLinesP(edges, 1, np.pi / 180, 30, minLineLength=40, maxLineGap=30)
lines1 =lines[:, 0, :]# 提取为二维
for x1, y1, x2, y2 in lines1[:]:
cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
#lsd=cv.createLineSegmentDetector(1)
#lines=lsd.detect(img)[0]
#drawn_img=lsd.drawSegments(img,lines)
#cv.imwrite("./LSD.png",drawn_img )
# _, binary = cv.threshold(gray, 175, 255, cv.THRESH_BINARY)
# cv.imwrite('edge.png',binary)
# minLineLength = 40
# maxLineGap = 10
# lines = cv.HoughLinesP(edges,1,np.pi/180,10,minLineLength,maxLineGap)
# for x1,y1,x2,y2 in lines[0]:
# cv.line(img,(x1,y1),(x2,y2),(255,0,255),2)
# cv.imwrite('houghlines5.jpg',img)
# lines = cv.HoughLines(edges,1,np.pi/180,70)
# print(lines)
# # 1/0
# # for rho,theta in lines[0]:
# for line in lines:
# rho = line[0][0] #
# theta= line[0][1]
# print(rho,theta)
# if (theta < (np.pi/4. ))or(theta > (3.*np.pi/4.0)):
# pt1 = (int(rho/np.cos(theta)),0) #该直线与第一行的交点
# #该直线与最后一行的焦点
# pt2 = (int((rho-img.shape[0]*np.sin(theta))/np.cos(theta)),img.shape[0])
# cv.line( img, pt1, pt2, (255)) # 绘制一条白线
# else: #水平直线
# pt1 = (0,int(rho/np.sin(theta))) # 该直线与第一列的交点
# #该直线与最后一列的交点
# pt2 = (img.shape[1], int((rho-img.shape[1]*np.cos(theta))/np.sin(theta)))
# cv.line(img, pt1, pt2, (255), 1) # 绘制一条直线
# a = np.cos(theta)
# b = np.sin(theta)
# x0 = a*rho
# y0 = b*rho
# x1 = int(x0 + 1000*(-b))
# y1 = int(y0 + 1000*(a))
# x2 = int(x0 - 1000*(-b))
# y2 = int(y0 - 1000*(a))
# cv.line(img,(x1,y1),(x2,y2),(255,0,255),2)
cv.imwrite('houghlines.png',img)
def main():
s = datetime.datetime.now()
# img = create_img()
# img,data = datama3(img)
# img = NGdata(img,data)
blackimg = create_img(color=(0,0,0))
blackimg = NGdata(blackimg,color=(255,255,255))
hough(blackimg)
e = datetime.datetime.now()
print((e-s))
if __name__ == "__main__":
main()
# hough()
本示例做了形态学处理
import cv2 as cv
import numpy as np
import pandas as pd
import re
import datetime
def create_img(color=(0)):
img = np.zeros([2048,2048,1],np.uint8) #单通道
img[:,:,0] = np.ones([2048,2048])*color
# img[500,500,0] = 0
cv.imwrite("./pic/new.png",img)
return img
def dataori(img):
data = pd.read_csv("*********************",encoding='ANSI')
# print(data)
datax = data['X'].to_list()
print('datax',len(datax))
# print(datax)
# 1/0
datay = data['Y'].to_list()
print('datay',len(datay))
# print(databool_list)
for i in range(len(datax)):
# print(re.findall(r"^[A-Za-z]+$",databool_list[i]))
# bool_list = re.split(r"X|Y",databool_list[i])
# bool_list = bool_list.remove('')
# bool_list = list(map(int, bool_list))
x = int(datax[i])
y = int(datay[i])
if x > 0:
x += 1024
elif x < 0:
x -= 1024
else:
x=1024
if y > 0:
y += 1024
elif y < 0:
y -= 1024
else:
y=1024
img[x,y,0] = 255
cv.imwrite("./pic/ori1mm.png",img)
return img,data
def picsolve(img,data):
# gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = cv.blur(img,(3,3))
_,binary = cv.threshold(gray,127,255,cv.THRESH_BINARY)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
for i in range(10):
binary = cv.dilate(binary, None, iterations=2)
binary = cv.erode(binary,None,iterations=3)
binary_x = list(np.where(binary==255)[0])
binary_x = binary_x - np.ones([len(binary_x)])*1024
# binary = binary.T
binary_y = list(np.where(binary==255)[1])
binary_y = binary_y - np.ones([len(binary_y)])*1024
print(binary_x)
print(binary_y)
print(len(np.where(binary==255)[0]))
print(len(np.where(binary==255)[1]))
df = pd.DataFrame({'X':binary_x,'Y':binary_y})
print(df)
df.to_csv("./pic/306C-6f.csv", index=False,encoding="ANSI")
result = pd.merge(df, data, how='inner', on=['X', 'Y'])
print(result)
result.to_csv("**********", index=False,encoding="ANSI")
cv.imwrite("./pic/binary.png",binary)
def main():
s = datetime.datetime.now()
img = create_img()
img,data = dataori(img)
picsolve(img,data)
e = datetime.datetime.now()
print((e-s))
if __name__ == "__main__":
main()
# hough()