100天精通Python丨黑科技篇 —— 06Python 修图(滤镜灰度裁剪视觉处理图像分割特征提取)
Posted 不吃西红柿丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天精通Python丨黑科技篇 —— 06Python 修图(滤镜灰度裁剪视觉处理图像分割特征提取)相关的知识,希望对你有一定的参考价值。
文章目录
有些小伙伴可能还不知道,Python的强大图片处理能力,今天西红柿来介绍一二。Python可以通过各种库(如Pillow、OpenCV、matplotlib等)进行图像的读取、修改、保存、显示等操作。Python可以对图片进行裁剪、旋转、缩放、滤镜、颜色调整等处理,还可以进行图像识别、图像分割、图像合成等高级图像处理。Python的图像处理能力不仅可以应用于计算机视觉、图像识别、机器学习等领域,也可以应用于图像处理软件开发、图像处理算法研究等方面。
本文收录于 《100天精通Python专栏 - 快速入门到黑科技》,是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造,分基础知识篇和黑科技应用两大部分,欢迎订阅本专栏,订阅后可私聊进Python全栈VIP交流群(问题解答、互相帮助)还可领取20GPython视频和100本互联网行业电子书。
- 基础知识篇以理论知识为主,旨在帮助没有语言基础的小伙伴,学习我整理成体系的精华知识,快速入门构建起知识框架;
- 黑科技应用篇以实战为主,包括数据分析、机器学习、计算机视觉、自然语言处理、数据可视化等等,让你真的会用Python解决实际问题。
学习路径指引 | 专栏定位 | 适宜人群 |
---|---|---|
体系化学习丨100天精通Python专栏 | 快速入门 | 没有语言基础,精华学习,快速掌握 |
黑科技实战丨100天精通Python专栏 | 玩转技术 | 有一定的基础,学以致用 |
CSDN x 信息技术智库社区 | 交流互助 | 你不是一个人在编程!! |
一、PIL 常规修图操作
以下是使用Python处理图片的示例代码:
1. 读取图片
from PIL import Image
# 打开图片
img = Image.open("image.jpg")
# 显示图片
img.show()
# 获取图片尺寸
width, height = img.size
# 获取像素数据
pixels = img.load()
# 遍历像素
for x in range(width):
for y in range(height):
r, g, b = pixels[x, y]
# 处理像素
2. 图片缩放
from PIL import Image
# 打开图片
img = Image.open("image.jpg")
# 缩放图片
img = img.resize((new_width, new_height))
# 保存图片
img.save("new_image.jpg")
3. 图片旋转
from PIL import Image
# 打开图片
img = Image.open("image.jpg")
# 旋转图片
img = img.rotate(angle)
# 保存图片
img.save("new_image.jpg")
4. 图片裁剪
from PIL import Image
# 打开图片
img = Image.open("image.jpg")
# 裁剪图片
img = img.crop((left, top, right, bottom))
# 保存图片
img.save("new_image.jpg")
5. 图片滤镜
from PIL import Image
from PIL import ImageFilter
# 打开图片
img = Image.open("image.jpg")
# 添加滤镜
img = img.filter(ImageFilter.GaussianBlur(radius))
# 保存图片
img.save("new_image.jpg")
以上是西红柿会用到的一些常用的图片处理操作的示例代码,具体实现可根据需要进行修改和调整。
当然,Python 还有很多其他强大的图片处理库和技术可以使用,虽然无法满足专业的修图需求,但脚本化一键处理,西红柿觉得也非常使用,以下是一些示例:
二、OpenCV 图像处理、视频处理、对象识别
OpenCV是一个广泛使用的计算机视觉库,可以用于图像处理、视频处理、对象识别等。它支持Python、C++、Java等多种编程语言。
下面是一个使用OpenCV实现的简单示例,将一张图片转换为灰度图:
import cv2
# 读取图片
img = cv2.imread('image.jpg')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示图片
cv2.imshow('gray', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、scikit-image 视觉算法,包括滤波、形态学操作、图像分割、特征提取
scikit-image是一个基于Python的图像处理库,提供了各种图像处理和计算机视觉算法,包括滤波、形态学操作、图像分割、特征提取等。
以下是一个使用scikit-image实现的简单示例,将一张图片进行边缘检测:
from skimage import io, filters
# 读取图片
img = io.imread('image.jpg')
# 边缘检测
edges = filters.sobel(img)
# 显示图片
io.imshow(edges)
io.show()
四、TensorFlow 图像分类、目标检测、图像生成
TensorFlow是一个流行的机器学习库,可以用于图像处理、自然语言处理、数据分析等领域。它提供了各种深度学习模型和算法,可以用于图像分类、目标检测、图像生成等任务。
以下是一个使用TensorFlow实现的简单示例,使用预训练的模型进行图像分类:
import tensorflow as tf
import numpy as np
from PIL import Image
# 加载模型
model = tf.keras.applications.MobileNetV2()
# 读取图片
img = Image.open('image.jpg').resize((224, 224))
img = np.array(img)
# 预处理图片
img = tf.keras.applications.mobilenet_v2.preprocess_input(img)
# 进行预测
predictions = model.predict(np.array([img]))
# 显示结果
print(tf.keras.applications.mobilenet_v2.decode_predictions(predictions, top=1)[0])
以上是一些常用的图像处理库和技术的示例,可以根据需要进行选择和使用。
从文件 b.py 中的函数附加到文件 a.py 后访问变量
【中文标题】从文件 b.py 中的函数附加到文件 a.py 后访问变量【英文标题】:Accessing a variable after being appended in file a.py from a function in file b.py 【发布时间】:2021-12-18 14:20:59 【问题描述】:我在尝试从文件 b.py 中的函数访问文件 a.py 中的变量时遇到问题。我尝试在互联网上四处寻找,但找不到任何东西,或者我不知道如何寻找我需要的东西。我还尝试创建另一个文件并更新文件 c.py 中的变量,但文件 b.py 仍然看到变量的第一次初始化。我尝试更新文件 a.py 中的变量,然后在 b.py 的函数中导入 a.py。
文件 a.py
var = []
def run():
a.welcome()
while True:
menu = a.menu()
if menu == 1:
def retrieve_path(source_path):
"""The function takes 1 parameter and checks if the file name exist as well as the file path
Adds the csv data to a variable
source_path (str): Path against whom to check for validity
"""
if not source_path:
print("Invalid file name, Please try again\n")
return
else:
import os
isFile = os.path.isfile(source_path)
if not isFile:
print("Invalid file path\n")
return
else:
with open(source_path, "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for line in csv_reader:
line = list(line)
var.append(line)
if __name__ == "__main__":
run()
文件 b.py
我试过这样,但我得到了变量var = []
的第一次初始化
我首先从文件 a.py 更新了 var,然后我尝试在文件 b.py 中使用下面的函数,但结果仍然相同。
from a import var
from a import *
import a
def a_function():
from a import var
from a import *
import a
print(var)
print(a.var)
这会打印 var which = [] 的第一次初始化,而不是在它被附加之后。
如果我从 a 打印 var,则从函数内部打印它更新。
如果我从 a 打印 var,则从函数外部打印它更新。
我不明白的是,为什么更新后,导入到b里面,还是得到第一次初始化。调试器也没有帮助。 我可以通过在 b.py 中添加函数 retrieve_path 然后将数据附加到文件 b.py 中的另一个变量中来解决它,但我想知道它为什么不导入 var 更新数据。
文件 b.py
var2 = []
def retrieve_path(source_path):
"""The function takes 1 parameter and checks if the file name exist as well as the file path
Adds the csv data to a variable
source_path (str): Path against whom to check for validity
"""
if not source_path:
print("Invalid file name, Please try again\n")
return
else:
import os
isFile = os.path.isfile(source_path)
if not isFile:
print("Invalid file path\n")
return
else:
with open(source_path, "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for line in csv_reader:
line = list(line)
var.append(line)
var2.append(line)
如果这是解决方案之一,我没有使用 Class 的原因是因为我对 Class 了解不多,暂时不知道如何正确使用它们。
我希望我说得非常明确,并且您理解我的困境。另外,请记住我刚开始学习 Python,因此非常欢迎新的解释和解决方案。
【问题讨论】:
你应该想知道 a.py 中的run
函数在哪里被调用过。根据您的代码,它永远不会...
我的坏 Serge,我在文件末尾有: if name == "main": run()
用你自己的话来说,if __name__ == "__main__":
是什么意思?您希望run
函数在您import a
时运行吗?为什么或者为什么不? (提示:此代码专门用于确保代码不会在您import
模块时运行,但仅在它是起点时运行。)
当我引起你的注意时,请阅读***.com/help/minimal-reproducible-example。
【参考方案1】:
正确的方法是在访问var
之前调用run
函数。要么
import a
a.run
print(a.var)
或:
from a import var, run
run
print(var)
import
语句只运行模块的内容,而不是其中声明的函数。
运行脚本的惯用方式确实是您在 a.py 中所拥有的:
if __name__ == "__main__":
run()
如果您将文件用作带有python a.py
的脚本,则会调用run
函数,因为由解释器直接 启动的文件将被命名为__main__
。但是导入的时候是按照文件名来命名的。所以这里应该是a
而不是main
。换句话说,当a.py
被导入时,run
永远不会被调用。
一种可能性是用run
的无条件调用来结束a.py:
...
line = list(line)
var.append(line)
run()
它应该是无害的,因为 Python 会跟踪已经导入的模块,并且即使模块是从多个地方导入的,run
也应该只调用一次。然而这将是一种反模式,因为按照惯例 import 应该尽可能少地产生副作用,而 run 似乎会执行很多操作。
【讨论】:
但问题是,var 在 run 函数之外。当 run() 运行时,它会更新全局变量 var。为什么需要在文件 b 中导入运行?谢谢 @FloreaConstantinCristian:请看我的编辑...【参考方案2】:好的,这只是我完成的学校项目的一部分,但我想让这部分的记录与我为年级所做的有点不同。如果某些功能没有意义,那是因为项目没有完成。我唯一关心的是记录变量。
main.py
import tui, csv
records = []
def run():
tui.welcome()
while True:
menu = tui.menu()
if menu == 1:
def retrieve_path(source_path):
"""The function takes 1 parameter and checks if the file name exist as well as the file path
Adds the csv data to a variable
source_path (str): Path against whom to check for validity
"""
if not source_path:
print("Invalid file name, Please try again\n")
return
else:
import os
isFile = os.path.isfile(source_path)
if not isFile:
print("Invalid file path\n")
return
else:
with open(source_path, "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for line in csv_reader:
line = list(line)
records.append(line)
tui.started("Data Loading")
retrieve_path(tui.source_data_path())
tui.completed("Data Loading")
if menu == 2:
tui.started("Retrieving data")
process_menu = tui.process_type()
tui.completed("Retrieving data")
if process_menu == 1:
tui.started("Retrieving entity name")
tui.entity_name()
tui.completed("Retrieving entity name")
if process_menu == 2:
tui.started("Retrieving entity details")
entity, cols = tui.entity_details()
tui.list_entity(entity, cols)
tui.completed("Retrieving entity details")
if menu == 3:
print(tui.main_records)
if menu == 4:
break
if __name__ == "__main__":
run()
第二个文件是:
tui.py
def welcome():
message = "System Management"
print("*" * len(message))
print(message)
print("*" * len(message))
def menu():
main_menu = "-"
while main_menu != "0":
if main_menu == "-":
print('Main Menu:'
'\n1. Load Data'
'\n2. Process Data'
'\n3. Visualise Data'
'\n4. Save Data'
'\n0. Exit')
elif main_menu in "1234":
return int(main_menu)
elif main_menu not in "1234":
error(main_menu)
return None
else:
print('Main Menu:'
'\n1. Load Data'
'\n2. Process Data'
'\n3. Visualise Data'
'\n4. Save Data'
'\n0. Exit')
main_menu = input()
def started(operation):
print(" has started.\n".format(operation))
def completed(operation):
print(" has completed.\n".format(operation))
def error(error_msg):
print("Error! is not a valid option.".format(error_msg))
def source_data_path():
print("Please enter the path to the source data file:")
source_path = input()
if ".csv" not in source_path:
return None
else:
return source_path
def process_type():
process_menu = "-"
while process_menu != "0":
if process_menu == "-":
print('Process Menu:'
'\n1. Retrieve entity'
'\n2. Retrieve entity details'
'\n3. Categorise entities by type'
'\n4. Categorise entities by gravity'
'\n5. Summarise entities by orbit'
'\n6. Return to Main Menu')
elif process_menu == "6":
menu()
return None
elif process_menu in "12345":
return int(process_menu)
elif process_menu not in "12345":
error(process_menu)
return None
else:
print('Process Menu:'
'\n1. Retrieve entity'
'\n2. Retrieve entity details'
'\n3. Categorise entities by type'
'\n4. Categorise entities by gravity'
'\n5. Summarise entities by orbit'
'\n6. Return to Main Menu')
process_menu = input()
def entity_name():
entity = input("Please enter the name of an entity: ")
return entity
def entity_details():
entity = input("Please enter the name of an entity: ")
indexes = input("Please enter the indexes number (e.g. 0,1,5,7):\n")
return entity, list(indexes)
请有 我第一次做这个项目时,我将 def retrieve_path(source_path): 添加到 tui.py 并且效果很好。
我不太明白为什么要附加变量记录,我可以从 run 内部和 run 函数外部打印它,但在 tui.py 中我只得到 records = [] 以及如何解决这个问题没有在 tui.py 中创建函数 retrieve_path
这是当时对我们的要求,这样做不是我个人的选择。
我很抱歉没有在这里粘贴所有内容并错误输入了一些部分,例如 == _ main _ .
【讨论】:
以上是关于100天精通Python丨黑科技篇 —— 06Python 修图(滤镜灰度裁剪视觉处理图像分割特征提取)的主要内容,如果未能解决你的问题,请参考以下文章
100天精通Python(数据分析篇)——第75天:Pandas数据预处理之数据标准化
100天精通Python(基础篇)——第1天:Python和Vscode环境安装
100天精通Python(数据分析篇)——第51天:numpy函数进阶
100天精通Python(数据分析篇)——第52天:numpy完结