python,tkinter,选一个目录,区分人物图片和风景图片

要在Python中使用Tkinter创建一个简单的GUI应用程序,让用户选择一个目录,并根据图片内容(人物或风景)对图片进行分类,你可以结合使用`tkinter`库来构建界面和`PIL`(Pillow)库来处理图像。此外,为了自动区分人物与风景图片,我们可以借助深度学习模型,比如使用预训练的卷积神经网络(CNN)。这里将展示如何用TensorFlow/Keras加载一个预训练模型来进行分类。

首先确保安装了必要的库:

```bash

pip install pillow tensorflow keras

```

接下来是具体的实现步骤:

1. **导入所需模块**

2. **定义图像分类函数**

3. **设置Tkinter GUI**

### 步骤 1: 导入所需的库

```python

import os

from tkinter import Tk, filedialog, Label, Button

from PIL import Image

import numpy as np

from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2, preprocess_input

from tensorflow.keras.preprocessing.image import img_to_array

from tensorflow.keras.models import load_model

```

### 步骤 2: 定义图像分类函数

这里我们使用MobileNetV2作为示例模型。你需要预先下载或训练一个能够识别“人”和“风景”的模型。如果你没有合适的模型,可以考虑使用一些在线服务如Google Cloud Vision API等。

```python

def classify_image(image_path):

    # 加载预训练模型

    model = MobileNetV2(weights='imagenet')

    

    # 打开并调整图片大小

    image = Image.open(image_path).resize((224, 224))

    image = img_to_array(image)

    image = np.expand_dims(image, axis=0)

    image = preprocess_input(image)

    # 预测

    predictions = model.predict(image)

    top_predictions = decode_predictions(predictions, top=1)[0]

    

    for (imagenetID, label, prob) in top_predictions:

        if "person" in label.lower():

            return "人物"

        else:

            return "风景"

# 注意:decode_predictions 函数来自 keras 应用程序,但不在标准导入中直接可用。

# 你需要从 `tensorflow.keras.applications.imagenet_utils` 中导入它。

from tensorflow.keras.applications.imagenet_utils import decode_predictions

```

### 步骤 3: 设置Tkinter GUI

```python

def select_folder():

    folder_selected = filedialog.askdirectory()

    if folder_selected:

        process_images_in_folder(folder_selected)

def process_images_in_folder(folder_path):

    images = [f for f in os.listdir(folder_path) if f.endswith('.jpg') or f.endswith('.png')]

    result_label.config(text="开始处理...")

    for image in images:

        full_path = os.path.join(folder_path, image)

        category = classify_image(full_path)

        print(f"{image} 是 {category}")

    result_label.config(text="处理完成!")

root = Tk()

root.title("图片分类器")

select_button = Button(root, text="选择文件夹", command=select_folder)

select_button.pack()

result_label = Label(root, text="")

result_label.pack()

root.mainloop()

```

这段代码提供了一个基本框架,用户可以选择一个包含图片的文件夹,然后程序会尝试对每个图片进行分类。请注意,这里的分类逻辑非常基础,可能需要根据实际使用的模型进行调整。如果使用更复杂的模型或者特定于任务的模型,记得相应地修改`classify_image`函数。

2Python--横竖屏图片分类

可以遍历输入的路径的指定后缀的文件,主要是用来筛选图片,将图片分成

横屏,竖屏分别存放在两个文件夹中

"""

# 安装模块

pip install pillow  PIL包含在里边

pip install image

pip install tqdm

pip install shutil

'''

from PIL import Image

import os

import os.path

from tqdm import tqdm

import shutil

import sys, os

if hasattr(sys, 'frozen'):

    os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']

# 函数查找指定路径中所有文件的路径

def get_file(path):

    list1 = []  # 用于存储递归查找到的所有文件,传递给函数

    fileList = os.listdir(path)  # 获取path目录下所有文件

    for filename in fileList:

        pathTmp = os.path.join(path, filename)  # 获取path与filename组合后的路径

        if os.path.isdir(pathTmp):  # 如果是目录

            a = get_file(pathTmp)  # 则递归查找(注意一定要有接受变量,不然就出错了)

            for i in a:

                list1.append(i)

        else:

            list1.append(pathTmp)

    return list1

# ---------------------修改处1,修改原始文件位置------------------------------------

print("横竖屏图片分类器,可以筛选指定路径下JPG与PNG格式图片,分别存放到横竖屏子文件夹中")

print("分类结束后按任意键退出程序")

path = input('请输入路径:').strip()  #.strip()去除首尾的空格,# 待分开文件的位置

file_path_list = get_file(path)

# 筛选后缀函数,传入包含所有后缀名的列表,以及需要筛选的后缀(默认筛选txt文件)

def shai_xuan_hou_zhui(file_path_list, hou_zhui='.txt'):

    list2 = []  # 用于储存筛选好的文件的路径

    for filepath in file_path_list:

        # os.path.splitext():分离文件名与扩展名

        if os.path.splitext(filepath)[1] == hou_zhui:

            list2.append(filepath)

    return list2

# ----------------------修改2,修改文件后缀,(可完善)------------------------------------

pig_list = shai_xuan_hou_zhui(file_path_list, '.jpg')  # 筛选jpg格式文件

pig_list = shai_xuan_hou_zhui(file_path_list, '.png')  # 筛选jpg格式文件

# -----------------------修改处3,修改图片存储路径-------------------------------

# 如果不存在创建套图文件夹

if not os.path.exists(r'{}/横屏图片'.format(path)):

    os.mkdir(r'{}/横屏图片'.format(path))

if not os.path.exists(r'{}/竖屏图片'.format(path)):

    os.mkdir(r'{}/竖屏图片'.format(path))

hengping = r'{}/横屏图片'.format(path)  # 存放横屏图片的地址

shuping = r'{}/竖屏图片'.format(path)   # 存放竖屏图片的地址

for i in tqdm(range(len(pig_list))):

    lujing = pig_list[i]

    picture = Image.open(lujing)

    width = picture.width

    height = picture.height

    picture.close()

    if width > height:

        #move移动,copy复制

        #shutil.move(lujing, folder1)

        shutil.copy(lujing, hengping)

    else:

        #shutil.move(lujing, folder2)

        shutil.copy(lujing, shuping)

        print('over,over,over!')

input('please input any key to exit!')

------------------------------

import os
import shutil
from tkinter import Tk, Button, filedialog, messagebox
from PIL import Image


def select_directory():
    # 打开文件对话框让用户选择一个目录
    directory = filedialog.askdirectory()
    if not directory:
        return  # 如果用户取消了选择,则退出函数

    # 定义存放结果的两个子文件夹路径
    landscape_folder = os.path.join(directory, 'landscape')
    portrait_folder = os.path.join(directory, 'portrait')

    # 确保这两个文件夹存在
    os.makedirs(landscape_folder, exist_ok=True)
    os.makedirs(portrait_folder, exist_ok=True)

    # 遍历选定目录下的所有文件
    for filename in os.listdir(directory):
        filepath = os.path.join(directory, filename)

        try:
            with Image.open(filepath) as img:
                width, height = img.size
                # 判断图片是横图还是竖图
                if width > height:
                    target_folder = landscape_folder
                else:
                    target_folder = portrait_folder

                # 移动图片到对应的文件夹
                shutil.move(filepath, os.path.join(target_folder, filename))
        except Exception as e:
            print(f"处理文件 {filename} 时发生错误: {e}")

    # 显示完成消息
    messagebox.showinfo("完成", "图片已按方向分类完毕!")


# 创建主窗口
root = Tk()
root.title("图片方向分类器")

# 添加选择目录按钮
Button(root, text="选择图片目录", command=select_directory).pack(pady=20)

# 运行应用
root.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rogabet-note

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值