欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

OpenCV+Python制作程序七夕(情人节)礼物

程序员文章站 2022-04-02 11:24:32
文章目录1. 按2. 配置环境3. 原理解读3.1. 读取Excel表格3.2. OpenCV读取图像并显示4. 完整代码5. 最后一步!超重要1. 按不知不觉七夕就过去了!如果有对象,祝早生贵子!没有对象,祝早结连理!(搞笑一下,祝大家幸福美满吧,嘿嘿嘿)给大家准备了一份已经写好的代码,利用Python+OpenCV+OpenPyXl,OpenCV实现读取图片像素颜色,然后OpenPyXl自动填充Excel表格对应单元格背景颜色,得到一副Excel填充图画。先来看看效果叭(gif动图)!把...



1. 按

不知不觉七夕就过去了!
如果有对象,祝早生贵子!没有对象,祝早结连理!
(搞笑一下,祝大家幸福美满吧,嘿嘿嘿)
给大家准备了一份已经写好的代码,利用Python+OpenCV+OpenPyXl,OpenCV实现读取图片像素颜色,然后OpenPyXl自动填充Excel表格对应单元格背景颜色,得到一副Excel填充图画。
先来看看效果叭(gif动图)!
OpenCV+Python制作程序七夕(情人节)礼物
把图片换成女朋友的真人图像会更逼真,会更加更好看。
然后看代码叭!

2. 配置环境

我们需要用到python以及OpenPyXl、OpenCV和xlsxwriter包,没有下载的小伙伴可以去配置一下,具体可参考:

配置完成后就是导入我们需要的包了,这儿不需要过多了解:

#导入opencv和openpyxl import openpyxl import cv2 as cv import numpy as np from openpyxl import load_workbook from openpyxl import workbook # 导入字体、边框、颜色以及对齐方式相关库 from openpyxl.styles import Font, Border, Side, PatternFill, colors, Alignment 

3. 原理解读

3.1. 读取Excel表格

我们首先需要读取一个xlsx格式的Excel表格,需要提前在工作路径或者某绝对路径进行创建,并自定义命名,然后我们得到了一个表格对象sheet,就可以对它进行读写设置等操作了。

#设置路径 #file_path = r"L:\jupyter notebook_code\file\zhaopian.xlsx"  #绝对路径 # 加载工作簿 wb = load_workbook(filename='zhaopian.xlsx') #默认工作路径,zhaopian.xlsx为Excel表格名称,自行更改 # 获取活动中的表格 sheet = wb.active print("open sheet:", sheet.title) #打印表格标题 print("row:", sheet.max_row, "column:", sheet.max_column) 

3.2. OpenCV读取图像并显示

#opencv读取图像并显示 '''
opencv的imread函数读取图片到srcImage
如果按原始大小读取图片,可以改为:srcImage = cv.imread('zhu.jpg')
加上第二个参数33:srcImage = cv.imread('zhu.jpg',33)
表示将原图缩为原来的1/4进行读取。当原图过大是可以采用
''' srcImage = cv.imread('zhaopian.jpg') #zhu.jpg为照片名字,自行更改 cv.imshow('image',srcImage) #获取图像的高,宽并打印 height = srcImage.shape[0] width = srcImage.shape[1] print("height:", height, "width:", width) 

利用opencv将图像读取进来,之后我们就要利用for循环遍历图像的各个像素值了,但在这之前我们需要自定义一个函数,因为我们是用openpyxl包的

PatternFill(fill_type='solid',fgColor= 'FFFFFF') 

函数填充单元格颜色的,该函数只能设置十六进制的颜色格式:
OpenCV+Python制作程序七夕(情人节)礼物
所以我们需要自己写一个函数将RGB颜色格式转换为十六进制:

#自定义函数,将RGB颜色值转换为16进制的字符串格式 def color_transform(value): digit = list(map(str, range(10))) + list("ABCDEF") if isinstance(value, tuple): string = '' for i in value: a1 = i // 16 a2 = i % 16 string += digit[a1] + digit[a2] return string elif isinstance(value, str): a1 = digit.index(value[1]) * 16 + digit.index(value[2]) a2 = digit.index(value[3]) * 16 + digit.index(value[4]) a3 = digit.index(value[5]) * 16 + digit.index(value[6]) return (a1, a2, a3) 

该函数实现的功能

输入:(0,0,0),输出:000000
输入:#FFFFFF,输出:(255, 255, 255) 

好了,解决了颜色转换,我们就遍历像素吧!

#遍历循环图片,获取各像素点位置的像素值,并利用openpyxl改写对应位置单元格颜色 for y in range(1, height): print("第几行:",y) #供查看进度 for x in range(1, width): Blue_value = srcImage[y,x,0] #获取蓝,绿,红三个通道 Green_value = srcImage[y,x,1] Red_value = srcImage[y,x,2] color = (Red_value,Green_value,Blue_value) #转为元组并附给color_transform函数得到16进制 hex_ = color_transform(color) fille = PatternFill(fill_type='solid',fgColor= hex_) #设置颜色 sheet.cell(y,x).fill=fille #openpyxl进行颜色填充 

具体大家看注释了,大概就是遍历像素并读取RGB像素值,然后传给color_transform函数进行转换,然后赋值给openpyxl的PatternFill进行Excel表格填充。
还有一步,就是保存了:

wb.save(filename = 'zhaopian.xlsx') # 保存工作簿 print("保存成功") 

4. 完整代码

######################################################################################################################## """
需要为python环境安装opencv以及openpyxl包
在python终端(看个人环境)执行:
pip install opencv-python
pip install openpyxl
如果有什么问题,请自行百度叭
欢迎关注本人CSDN博客【Coco56】,看更详细教程
用有趣好玩的案例带你学哦
""" ######################################################################################################################## # 导入opencv和openpyxl import cv2 as cv from openpyxl import load_workbook from openpyxl.styles import PatternFill from openpyxl.utils import get_column_letter import xlsxwriter ######################################################################################################################## '''
图片必须jpg格式
程序有一点没能调出来的bug,可能会运行成功但excal无法打开,换一个行宽都小一点的图片就行了,或者利用opencv对图片缩放
''' ######################################################################################################################## workbook = xlsxwriter.Workbook('zhaopian.xlsx') # 打开一个xlsx文件(如果打开的文件存在 ,则清空该文件,如果文件不存在,则新建) workbook.close() # 最后关闭文件 # 自定义函数,将RGB颜色值转换为16进制的字符串格式 def color_transform(value): digit = list(map(str, range(10))) + list("ABCDEF") if isinstance(value, tuple): string = '' for i in value: a1 = i // 16 a2 = i % 16 string += digit[a1] + digit[a2] return string elif isinstance(value, str): a1 = digit.index(value[1]) * 16 + digit.index(value[2]) a2 = digit.index(value[3]) * 16 + digit.index(value[4]) a3 = digit.index(value[5]) * 16 + digit.index(value[6]) return a1, a2, a3 # 加载工作簿 wb = load_workbook(filename='zhaopian.xlsx') # 默认工作路径,zhaopian.xlsx为Excal表格名称,自行更改 # 获取活动中的表格 sheet = wb.active print("open sheet:", sheet.title) # 打印表格标题 print("row:", sheet.max_row, "column:", sheet.max_column) # opencv读取图像并显示 '''
opencv的imread函数读取图片到srcImage
如果按原始大小读取图片,可以改为:srcImage = cv.imread('zhu.jpg')
加上第二个参数33:srcImage = cv.imread('zhu.jpg',33)
表示将原图缩为原来的1/4进行读取。当原图过大是可以采用
''' srcImage = cv.imread('zhaopian.jpg') # zhu.jpg为照片名字,自行更改 # 获取图像的高,宽并打印 height = srcImage.shape[0] width = srcImage.shape[1] print("height:", height, "width:", width) # 遍历循环图片,获取各像素点位置的像素值,并利用openpyxl改写对应位置单元格颜色 for y in range(1, height): print("第几行:", y) # 供查看进度 for x in range(1, width): Blue_value = srcImage[y, x, 0] # 获取蓝,绿,红三个通道 Green_value = srcImage[y, x, 1] Red_value = srcImage[y, x, 2] color = (Red_value, Green_value, Blue_value) # 转为元组并附给color_transform函数得到16进制 hex_ = color_transform(color) fille = PatternFill(fill_type='solid', fgColor=hex_) # 设置颜色 sheet.cell(y, x).fill = fille # openpyxl进行颜色填充 width = 3.0 height = width * (2.2862 / 0.3612) print("row:", sheet.max_row, "column:", sheet.max_column) for i in range(1, sheet.max_row+1): sheet.row_dimensions[i].height = height for i in range(1, sheet.max_column+1): sheet.column_dimensions[get_column_letter(i)].width = width

wb.save(filename='zhaopian.xlsx') # 保存工作簿 print("保存成功") 

5. 最后一步!超重要

在发给对象之前,一定把excel表格打开看一下,确保是这样的:
OpenCV+Python制作程序七夕(情人节)礼物
也就是缩放正常的表格,只有这样,当她滚动鼠标滚轮进行缩放,渐渐变成下图这样时,才会有惊喜嘛!
OpenCV+Python制作程序七夕(情人节)礼物
如果直接一打开就是上图,和一个照片也没什么两样,也就没那么惊喜了,是不是?

还有,别告诉你对象是用代码生成的,告诉她:

“这是我一个一个单元格填充了一个月颜色的成果,我是爱你的,么么哒,带上身份证,咱们去看电影吧~”

本文地址:https://blog.csdn.net/COCO56/article/details/108234890

相关标签: Python OpenCV