100天精通Python丨黑科技篇 —— 06Python 修图(滤镜灰度裁剪视觉处理图像分割特征提取)

Posted 不吃西红柿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天精通Python丨黑科技篇 —— 06Python 修图(滤镜灰度裁剪视觉处理图像分割特征提取)相关的知识,希望对你有一定的参考价值。

文章目录

有些小伙伴可能还不知道,Python的强大图片处理能力,今天西红柿来介绍一二。Python可以通过各种库(如Pillow、OpenCV、matplotlib等)进行图像的读取、修改、保存、显示等操作。Python可以对图片进行裁剪、旋转、缩放、滤镜、颜色调整等处理,还可以进行图像识别、图像分割、图像合成等高级图像处理。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完结

100天精通Python(基础篇)——第29天:标准库sys

100天精通Python(数据分析篇)——第53天:初始pandas模块