首先用PIL库里的Image打开图像:
img = Image.open(r'C:\Users\xxxxx\Desktop\jks.jpg')
使用img.size发现这个图像为1920x1031个像素点,在ps上没法完全显示出来,因此我们需要对其进行压缩一下。
width,height = img.size
ya_suo_lv = 0.8
img = img.resize((int(width*ya_suo_lv),int(height*ya_suo_lv)),Image.ANTIALIAS)#压缩
通过PIL将其转化为灰度图:
def dodge(a, b, alpha):
return min(int(a*255/(256-b*alpha)), 255)
blur=25
alpha=1.0
# 图片转换成灰色
img1 = img.convert('L')
img2 = img1.copy()
img2 = ImageOps.invert(img2)
# 模糊度
for i in range(blur):
img2 = img2.filter(ImageFilter.BLUR)
width, height = img1.size
for x in range(width):
for y in range(height):
a = img1.getpixel((x, y))
b = img2.getpixel((x, y))
img1.putpixel((x, y), dodge(a, b, alpha))
img3 = Image.blend(img1,img1,1)#灰度处理后的图片
将其二值化,转化为黑白简笔画,转化阈值取mean:
#二值化转成黑白图
img_arr = np.array(img1)
img2 = np.where(img_arr[...,:] < img_arr.mean(), 0, 255)
black = img2
img2 = Image.fromarray(img2)
然后我们通过pyautogui库去操纵鼠标移动和点击,思路为遍历存储图片信息的numpy矩阵,当矩阵值为0时跳过,为255时则操纵鼠标移动和点击:
point = black
x0=100
y0=50
for y in range(0,len(point)):
for x in range(0,len(point[y])):
if point[y][x1]!=255:
pyautogui.moveTo(y+y0, x+x0)#光标移动到此处
pyautogui.click()#点击一次左键
最终绘画效果图如下所示:
完整代码:
from PIL import Image, ImageFilter, ImageOps
import numpy as np
import pyautogui
img = Image.open(r'C:\Users\xxxxxx\Desktop\jks.jpg')
width,height = img.size
ya_suo_lv = 0.8
img = img.resize((int(width*ya_suo_lv),int(height*ya_suo_lv)),Image.ANTIALIAS)#压缩
def dodge(a, b, alpha):
return min(int(a*255/(256-b*alpha)), 255)
blur=25
alpha=1.0
# 图片转换成灰色
img1 = img.convert('L')
img2 = img1.copy()
img2 = ImageOps.invert(img2)
# 模糊度
for i in range(blur):
img2 = img2.filter(ImageFilter.BLUR)
width, height = img1.size
for x in range(width):
for y in range(height):
a = img1.getpixel((x, y))
b = img2.getpixel((x, y))
img1.putpixel((x, y), dodge(a, b, alpha))
img3 = Image.blend(img1,img1,1)#灰度处理后的图片
#########img3.show(title = '压缩并灰度处理后的图片')
#二值化转成黑白图
img_arr = np.array(img1)
img2 = np.where(img_arr[...,:] < img_arr.mean(), 0, 255)
black = img2
img2 = Image.fromarray(img2)
#########img2.show(title = '灰度处理后再二值化处理的图片')#二值化处理后的图片
point = black
x0=100
y0=50
for y in range(0,len(point)):
for x in range(0,len(point[y])):
if point[y][x1]!=255:
pyautogui.moveTo(y+y0, x+x0)#光标移动到此处
pyautogui.click()#点击一次左键