前言
分享一个比较有趣的自动化项目,可以帮助实现将准备的图片画在桌面上,是实实在在的画出来。
预览一下效果
这个是在百度上找的图片
将图片进行二值化处理后的效果
通过画图工具画出来的效果。
核心代码
将图片进行二值化处理
from PIL import Image
import cv2
import numpy as np
def binaryzation():
'''图片二值化'''
#读取图片
src = cv2.imread('picture/021.png')
#灰度图像处理
GrayImage = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#二进制阈值化处理
r, b = cv2.threshold(GrayImage, 100, 255, 8) # 可选0,1,8,9,16,17
# r, b = cv2.threshold(GrayImage)
# print(b)
yx = np.column_stack(np.where(b==0))
print(yx)
# 保存图片:就是把数组保存成图
im = Image.fromarray(b)
im.save("picture/020_2.png")
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", b)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
binaryzation()
执行这步,可将图片进行二值化处理,, 处理后的效果
将图片的坐标点保存到文件中
import cv2
from PIL import Image
import sys
import numpy as np
class Site_File():
def cut_image(self, image):
'''切割图像'''
width, height = image.size
print(width, height)
# item_width = int(width / 582)
item_width = 1
box_list = []
# (left, upper, right, lower)
for i in range(width):#0.01s为一段,8s=800个0.01s
box = (i*item_width,0,(i+1)*item_width,height)
box_list.append(box)
image_list = [image.crop(box) for box in box_list] #crop用于切割图片
print(len(image_list))
return image_list
def save_images(self, image_list):
'''把切割图像保存到文件'''
index = 1
for image in image_list:
# image.save(r'E:/project/wjs/demo/image/ima/'+str(index) + '.png', 'PNG')
image.save('picture/ima20/'+str(index) + '.png', 'PNG')
index += 1
def create_file1(self, width):
dic = {}
x = 1
for i in range(width): # 循环次数为图片量
# for i in range(350):
# img = cv2.imread('image/ima1/'+str(i+1) + '.png')
img = cv2.imread('E:/project/wjs/draw/picture/ima20/' + str(i + 1) + '.png')
# img = cv2.imread('E:/project/wjs/demo/image/ima1/35' + '.png')
# 灰度图像处理
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二进制阀值化处理
# r, b = cv2.threshold(hsv, 180, 255, 9)
yx = np.column_stack(np.where(hsv == 0)) # 0 为背景为黑 1为背景为白
print(yx)
length = len(yx)
# 将连续的坐标点依次写入文件
if length != 0:
dic_dic = {}
a_a = 1
list1 = [yx[0][0]]
# 判断是否连续,连续的以键值对存入字典
for i in range(1, length):
if (yx[i][0] - list1[-1]) == 1:
list1.append(yx[i][0])
else:
print(list1)
dic_dic[a_a] = list1
a_a += 1
list1 = [yx[i][0]]
if i == length - 1:
dic_dic[a_a] = list1
dic[x] = dic_dic
dic_dic = {}
a_a += 1
x += 1
print(dic)
with open('coord_file/020.txt', 'a+') as f:
f.write(str(dic))
if __name__ == '__main__':
file_path = "picture/020_2.png"
image = Image.open(file_path) # 创建图片对象
picture_file = Site_File() # 创建对象
image_list = picture_file.cut_image(image)
# #image.show()
picture_file.save_images(image_list)
width, height = image.size
# 保存文件
picture_file.create_file1(width)
这段代码的意思,大概分为 首先将图片按照切分为分辨率大小的份数 然后通过循环读取坐标点,最后将这些坐标点记录在一个txt文件中。(图片二值化后只有黑色和白色,循环读取黑色点的坐标就可以将整个图片有黑色的区域通过坐标的方式记录到文件中,就可以读取图片中的有图像的坐标点)
通过pyautogui实现自动化画图
import pyautogui,time
time.sleep(3)
# 打开文件
with open('coord_file/013.txt', 'r') as f:
data = eval(f.read())
# print(data)
# print(type(data))
def draw():
'''进行画画'''
for x, y_dic in data.items():
x = x + 250
for index in y_dic:
# 如果长度只有3个以下连续,就依次点击
if len(y_dic[index]) <= 3:
for i in y_dic[index]:
y = i + 150
print(x, y)
pyautogui.click(x, y)
# 连续坐标点长度大于三个,连接坐标点开头和结尾
else:
# for i in y_dic:
y1 = y_dic[index][0] + 150
print(x, y1)
pyautogui.mouseDown(x, y1, button='left')
y2 = y_dic[index][-1] + 150
print(x, y2)
pyautogui.moveTo(x, y2)
pyautogui.mouseUp()
# pyautogui.mouseDown()
if __name__ == '__main__':
draw()
这段代码,将txt的文件读出来实现自动画图。画图的最终效果
总结提醒:
画图的时候可以用电脑自带的画图工具,并将鼠标改为粉笔的状态,调整好画布的大小,运行起来就可以看到神奇的效果了