长沙理工《人工智能基础A》实验(上机)报告实验三 电商数据可视化/图像处理

作业描述:

一、下载所有作业文件并打开研究一下作业内容

图 1 找到下载好的文件对应的目录下(也称文件夹下面),进入之后长按鼠标左键 拖动鼠标选中刚刚下载好的所有文件之后右键 鼠标,点击**剪切(T),**然后前往桌面新建一个文件夹用于存放作业文件

图 2 新建好的文件夹在桌面上,一开始是这种空文件夹的状态(文件夹起名最好全英文 ,这样可以避免电脑编码错误导致报错)担心有些同学不知道如何新建文件夹 ,这里说一下,鼠标左键 点击空白位置,右键鼠标之后出现如图所示选项,依次选中就可以新建了

图 3 双击进入刚刚创建好的名为tg 的文件夹(目录)下面,发现地址已经在这个文件夹下面了,然后鼠标右键 空白处,滑动鼠标到粘贴按钮,鼠标左键 点击粘贴按钮粘贴图1剪切好的多个文件,成功之后返回桌面可以发现效果如图4所示

图 4 装好文件的目录(也称文件夹)外观就像这样,这样就完成了初步准备工作,然后就可以点击进入各个可查看的文档了解作业内容了

图 5 在 图 3 所示的目录(也称文件夹 )名为 tg 的目录(也称文件夹 )下面双击打开名为 实验报告-实验三.docx 的文件,看到如图所示内容,接下来分析需求,首先他要求安装pycharm,并配置Python 解释器(配置python解释器的意思是说,python解释器和pycharm是两个东西,pycharm是一个集成开发工具,这个开发工具本身并不具备运行python代码的能力,底层仍然是依赖python解释器运行代码,所以要先安装好python解释器,然后把python解释器的安装位置告诉pycharm这样pycharm才能调用python解释器执行程序)所以下一步的工作是下载安装pycharm

二、下载安装PyCharm

Windows系统上的pycharm下载链接地址:
https://www.jetbrains.com.cn/en-us/pycharm/download/download-thanks.html?platform=windows

Macos系统上的pycharm下载链接地址:https://www.jetbrains.com.cn/en-us/pycharm/download/download-thanks.html?platform=macM1

图 6 复制 或者双击跳转访问 我提供的链接,自己是windows系统就复制Windows的链接,反之复制Macos系统的链接,在一个导航栏 (红色是导航栏 绿色是搜索栏 这两个不一样,要分清楚),在里面输入链接,然后点击回车键 (也就是确认键, 上面写的是enter,有进入,确认 等意思),然后浏览器就会访问页面,并自动下载pycahrm

图 7 如图所示,下载差不多持续 600秒 的时间,如果低于这个速度建议办个新的流量卡(哈哈,无情嘲笑

图 8 本程序猿电脑一直都配置了pycharm,为了大家看得直观,我先卸载再重装 (虽然麻烦但是比较管用,哈哈)

图 9 下载好以后,找到下载位置双击鼠标左键打开运行这个安装文件

图 10 双击之后系统会提示你是否运行该文件对系统进行操作,点击 ,因为刚刚页面无法截图,所以没有截图,遇到这个弹窗点击下一步这个按钮

图 11 这里选择默认的安装位置即可(不需要做任何操作 ),点击下一步按钮即可

图 12 按照如图所示勾选,最重要的是勾选红色方框 选中的这个按钮,然后点击下一步按钮

图 13 什么都不做,点击安装按钮

图 14 静静等待安装到安装完毕

图 15 勾选 运行pycharm,然后点击完成按钮

图 16 遇到这个弹窗点击允许访问按钮,通过防火墙请求,然后就属于完成了网络授权和初步安装

三、配置python解释器给pycharm编辑器

参考我的实验2这篇文章的**步骤二、三、四,**完成python解释器的安装部署

长沙理工《人工智能基础A》实验(上机)报告实验二 Python编程基础实践2

这里给大家简单解释一下,python解释器和pycharm编辑器(又称为pycharm集成开发工具 )的区别,1. python解释器 是一个底层的python代码翻译工具,可以把你写好的python项目运行成可见的程序应用而pycharm 则是一款集成开发工具,它是方便程序员编写代码的一款编辑器软件,使用它可以方便的编写代码;2. 为什么要进行配置环节呢,因为电脑其实很蠢,只有我们告诉pycharm 我们的python解释器 部署安装在哪,它才能找到它并使用它,不然pycharm 就只是个花架子

图 17 遇到这个页面直接点击 skip import 跳过引入(导入)的意思,因为我的电脑原先安装了别的集成开发工具,所以它识别到以后想要直接借用原有的设置跳过手动设置这一环节,我这里选择跳过导入

图 18 点击这个 new project进入下一个界面

图 19 给大家介绍一下这三个方框代表的意思,从上到下依次是:1. 项目所在地址,这里待会要切换成我们刚刚创建的tg 目录(也称文件夹 )的地址(也称路径 )2. 编译解释类型,当前无需太多了解,选择这个Project venv ,它的意思是项目虚拟环境,venv是虚拟环境的缩写 3. python 版本的意思,是这里一般是你按照我在长沙理工《人工智能基础A》实验(上机)报告实验二 Python编程基础实践2

一文中,步骤二、三、四, 完成配置好之后会自动选择 的,如果没有完成配置就无法正确选择,所以一定要完成这篇文章的二三四步骤,(搞不定可以联系我,虽然不一定回复,哈哈)

图 20 找到本文步骤一创建好的tg 目录(也称文件夹 ),点击图中箭头所示的空白框区域,变成蓝色选中状态,手指同时按下键盘上的 ctrlx这两个按钮,发现成功剪切(这是剪切的快捷键)了这个路径地址

图 21 然后找到之前的pycharm页面,在地址栏里面同时按下ctrlv 键,这是粘贴的快捷键(这样就完成了粘贴路径到对应位置),然后点击右下角蓝色create创建的意思

图 22 这个时候出现弹窗,意思就是,目录非空 (因为这个目录【文件夹】下面存放了我们的文件,目录不为空,所以系统提示我们要怎么做,是创建项目还是打开这个项目),这里点击**创建项目,**因为pycharm的功能其实就是运行的时候在一个目录下面创建一个标记,拥有这个标记的目录会被pycharm识别为一个项目,现在这个项目并没有创建pycharm标记,所以点击创建按钮是可行的

图 23 进入这个页面,发现 框选的 .venv 这个目录颜色特殊,下方的**.py**后缀的文件也有python的蟒蛇标志,说明配置成功,系统已经正常的完成了pycharm和python的建交

四、运行老师布置的任务

图 24 鼠标左键双击这个Python_DataAnalysis.py文件,pycharm会自动打开它,展示在右边

图 25 点击这个播放按钮,这是运行程序的意思

图 26 控制台报错输出红色提示 No module named 'matplotlib'

图 27 点击左下角这个按钮,这个按钮的名字叫做终端 按钮(由一个箭头和下划线组成

图 28 在图中所示区域,输入代码:pip install matplotlib ,然后点击回车(也就是enter 键)等待代码运行,这句代码意思是使用名为pip 的python工具在python官方库下载一个名为matplotlib的绘图工具包

图 29 发现果然在下载一大片东西,报错提示请输入运行python.exe -m pip install --upgrade pip

这个意思是说:当前的pip版本不是最新的,建议你更新到最新pip,我们直接复制这个命令输入到下面画红线的位置粘贴 ,然后回车 ,这样的话就会继续升级pip工具

图 30 现在点击运行按钮,项目仍然报错 No module named 'pandas',我们重复前一个步骤,前往终端窗口输入pip install pandas,并按下回车键等待下载安装pandas包(不得不说,pycharm设计的非常美观,安装过程的数据流让我觉得赏心悦目)

图 31 这个时候点击编译器的"播放"(运行)按钮,发现一点报错都没有,程序完美运行结束,但是没有任何展示画面,这是因为代码只是写好了,但是没有被调用,把下面这个代码复制,粘贴到代码最后面,然后点击运行

python 复制代码
if __name__ == "__main__":
    # 示例数据
    x = ['产品A', '产品B', '产品C']
    y = ['年龄1', '年龄2', '年龄3']
    z = [100, 200, 150]

    # 调用函数绘制3D条形图
    plot_3d_bar(x, y, z)

    # 示例数据框
    df = pd.DataFrame({
        '产品': ['T恤', 'T恤', '裤子', '裤子'],
        '年龄群体': ['20-30', '30-40', '20-30', '30-40'],
        '销售金额': [100, 200, 150, 250]
    })

    # 调用函数绘制2D销售图
    plot_sales_2d(df, '产品', 'T恤', '年龄群体', '销售金额')

    # 调用函数绘制雷达图
    plot_radar(df, '产品', ['年龄群体'], '销售金额', ['20-30'])

图 32 我把代码粘贴在代码Python_DataAnalysis.py 文件的最后,点击运行 按钮,得到输出结果,出现了3d效果的画面,到这里进入尾声了

五、修改代码实现读取excel数据,并显示自己的名字学号

图 33 在终端区域输入pip install xlrd并按下回车运行,安装好xlrd库

python 复制代码
import os
import matplotlib
# 优先启用交互式后端(Windows常见为TkAgg),失败则使用默认后端
try:
    matplotlib.use('TkAgg')
except Exception:
    pass
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib import cm

# 设置中文字体,解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False

def _normalize_col_name(s):
    return str(s).strip().replace('\u3000', '').replace(' ', '')

def load_dataframe(file_path, preferred_sheet=None):
    """
    读取Excel并尽量匹配到'产品类别'、'年龄群体'、'销售金额'三列。
    如果preferred_sheet提供,则优先尝试该工作表;否则从所有工作表中选匹配最多的一张。
    返回:标准化列名后的DataFrame;失败返回None。
    """
    try:
        sheets = pd.read_excel(file_path, sheet_name=None)
    except Exception as e:
        print(f'读取Excel失败:{e}')
        return None

    synonyms = {
        '产品类别': ['产品类别', '商品类别', '类别', '品类', '产品类型', '产品种类'],
        '年龄群体': ['年龄群体', '年龄段', '年龄组', '年龄', '年龄范围'],
        '销售金额': ['销售金额', '销售额', '金额', '销售', '总金额', '订单金额']
    }
    normalized_synonyms = {k: {_normalize_col_name(v) for v in vs} for k, vs in synonyms.items()}

    def try_match(df):
        norm_map = {c: _normalize_col_name(c) for c in df.columns}
        found = {}
        for canon, candidates in normalized_synonyms.items():
            for original, norm in norm_map.items():
                if norm in candidates:
                    found[canon] = original
                    break
        return found

    chosen_df = None
    chosen_sheet_name = None
    best_found = {}

    # 优先尝试preferred_sheet
    if preferred_sheet and preferred_sheet in sheets:
        df = sheets[preferred_sheet]
        found = try_match(df)
        best_found = found
        if len(found) == 3:
            chosen_df = df.rename(columns={found['产品类别']: '产品类别',
                                           found['年龄群体']: '年龄群体',
                                           found['销售金额']: '销售金额'})
            chosen_sheet_name = preferred_sheet
            print(f'使用工作表:{preferred_sheet}')
            return chosen_df

    # 遍历所有工作表,选择匹配最多的一张
    for sname, df in sheets.items():
        found = try_match(df)
        if len(found) > len(best_found):
            best_found = found
            rename_map = {}
            if '产品类别' in found:
                rename_map[found['产品类别']] = '产品类别'
            if '年龄群体' in found:
                rename_map[found['年龄群体']] = '年龄群体'
            if '销售金额' in found:
                rename_map[found['销售金额']] = '销售金额'
            chosen_df = df.rename(columns=rename_map)
            chosen_sheet_name = sname
            if len(found) == 3:
                break

    if chosen_df is None:
        print('未找到可用的工作表。')
        return None

    missing = {k for k in ['产品类别', '年龄群体', '销售金额'] if k not in chosen_df.columns}
    if missing:
        print(f"工作表'{chosen_sheet_name}'缺少列:{', '.join(missing)}。实际列为:{list(chosen_df.columns)}")
        return None

    print(f'使用工作表:{chosen_sheet_name}')
    return chosen_df

def _add_name(fig, name):
    # 将名字置于图表上方
    fig.suptitle(name, fontsize=14, y=0.98)


def plot_3d_bar(x, y, z, name, save_path=None):
    """
    根据给定的数据绘制3D条形图,并在图表中添加名字。
    参数:
    x: x轴数据(产品类别)
    y: y轴数据(年龄群体)
    z: z轴数据(销售金额)
    name: 要显示的名字
    """
    # 先按"产品类别-年龄群体"汇总,减少绘制数量
    df_raw = pd.DataFrame({'产品类别': x, '年龄群体': y, '销售金额': z})
    grouped = df_raw.groupby(['产品类别', '年龄群体'], as_index=False)['销售金额'].sum()

    # 唯一类别
    x_unique = grouped['产品类别'].unique()
    y_unique = grouped['年龄群体'].unique()

    # 创建索引映射
    x_index_map = {val: idx for idx, val in enumerate(x_unique)}
    y_index_map = {val: idx for idx, val in enumerate(y_unique)}
    x_indices = grouped['产品类别'].map(x_index_map).values
    y_indices = grouped['年龄群体'].map(y_index_map).values

    # 宽度与高度
    dx = np.full_like(x_indices, 0.8, dtype=float)
    dy = np.full_like(y_indices, 0.8, dtype=float)
    dz = grouped['销售金额'].values

    # 生成颜色映射
    colors = cm.viridis(np.linspace(0, 1, len(y_unique)))  # 使用viridis颜色映射

    # 绘制3D条形图
    fig = plt.figure(figsize=(8, 6))
    ax = fig.add_subplot(111, projection='3d')

    # 为每个y轴类别指定一个颜色,并一次性绘制所有条形
    bar_colors = colors[y_indices]
    ax.bar3d(x_indices, y_indices, np.zeros_like(dz), dx, dy, dz, color=bar_colors, zsort='average')
    ax.view_init(elev=20, azim=35)

    # 设置x轴和y轴的标签
    ax.set_xticks(np.arange(len(x_unique)))  # 设置x轴位置
    ax.set_xticklabels(x_unique)  # 设置x轴标签为产品类别
    ax.set_yticks(np.arange(len(y_unique)))  # 设置y轴位置
    ax.set_yticklabels(y_unique)  # 设置y轴标签为年龄群体

    # 设置z轴的标签
    ax.set_zlabel('销售金额')  # 设置z轴标签为销售金额

    # 设置轴标题
    ax.set_title('产品类别与年龄群体的销售情况')

    # 在图表上方添加名字
    _add_name(fig, name)
    plt.tight_layout(rect=[0, 0, 1, 0.95])
    if save_path:
        fig.savefig(save_path, dpi=150, bbox_inches='tight')
        plt.close(fig)
    else:
        plt.show()


def plot_sales_2d(df, product_column, product_name, age_column, sales_column, name, save_path=None):
    """
    绘制条形折线复合图,并在图表中添加名字。
    参数:
    df: 数据框
    product_column: 产品列名
    product_name: 产品名称
    age_column: 年龄群体列名
    sales_column: 销售金额列名
    name: 要显示的名字
    """
    # 根据产品类别筛选数据
    product_sales = df[df[product_column] == product_name]
    if product_sales.empty:
        print(f"没有找到产品 '{product_name}' 的数据,跳过2D图绘制。")
        return

    # 计算每个年龄群体的销售金额总和
    sales_by_age = product_sales.groupby(age_column)[sales_column].sum().reset_index()

    # 创建图形
    fig, ax1 = plt.subplots(figsize=(8, 6))

    # 绘制柱形图
    ax1.bar(sales_by_age[age_column], sales_by_age[sales_column], color='g', alpha=0.6, label='{}-销售金额 (柱形图)'.format(product_name))
    ax1.set_xlabel('年龄群体')
    ax1.set_ylabel('销售金额总和 (柱形图)', color='g')
    ax1.tick_params(axis='y', labelcolor='g')

    # 创建第二个y轴
    ax2 = ax1.twinx()

    # 绘制折线图
    ax2.plot(sales_by_age[age_column], sales_by_age[sales_column], marker='o', color='b', linestyle='-',
             label='{}-销售金额 (折线图)'.format(product_name))
    ax2.set_ylabel('销售金额总和 (折线图)', color='b')
    ax2.tick_params(axis='y', labelcolor='b')

    # 设置标题
    ax1.set_title('{}-销售金额总和 by 年龄群体'.format(product_name))

    # 在图表上方添加名字
    _add_name(fig, name)

    # 显示图例
    ax1.legend(loc='upper left')
    ax2.legend(loc='upper right')

    # 保存或显示
    plt.tight_layout(rect=[0, 0, 1, 0.95])
    if save_path:
        fig.savefig(save_path, dpi=150, bbox_inches='tight')
        plt.close(fig)
    else:
        plt.show()


def plot_radar(df, product_column, group_columns, sales_column, target_group, name, save_path=None):
    """
    绘制雷达图,并在图表中添加名字。
    参数:
    df: 数据框
    product_column: 产品列名
    group_columns: 分组列名
    sales_column: 销售金额列名
    target_group: 目标群体
    name: 要显示的名字
    """
    # 根据目标群体筛选数据(允许不筛选)
    filters = []
    if target_group:
        filters = target_group if isinstance(target_group, (list, tuple)) else [target_group]
        for group_column, target_value in zip(group_columns, filters):
            df = df[df[group_column] == target_value]
    if df.empty:
        tg = filters if filters else ['(全部)']
        print(f"没有找到符合条件的群体: {', '.join(map(str, tg))}")
        return

    # 计算每个产品类别的销售金额总和
    sales_by_product = df.groupby(product_column)[sales_column].sum().reset_index()

    # 提取产品类别和相应的销售金额
    categories = sales_by_product[product_column].values
    sales_totals = sales_by_product[sales_column].values

    # 计算雷达图的角度
    angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()

    # 雷达图的图形准备
    fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))

    # 数据填充
    sales_totals = np.concatenate((sales_totals, [sales_totals[0]]))  # 将第一个数据点重复,使得图形闭合
    angles += angles[:1]  # 让角度圆周闭合

    # 绘制雷达图
    ax.fill(angles, sales_totals, color='b', alpha=0.6, label='销售金额总和')
    ax.plot(angles, sales_totals, color='b', linewidth=2)

    # 设置雷达图的标签
    ax.set_yticklabels([])  # 不显示y轴标签
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(categories, fontsize=12)

    # 设置标题
    ax.set_title(f'{", ".join(target_group)}群体的产品销售金额', fontsize=14)

    # 在图表上方添加名字
    _add_name(fig, name)
    # 保存或显示
    plt.tight_layout(rect=[0, 0, 1, 0.95])
    if save_path:
        fig.savefig(save_path, dpi=150, bbox_inches='tight')
        plt.close(fig)
    else:
        plt.show()


if __name__ == "__main__":
    # 读取 Excel 文件(自动匹配列与工作表)
    file_path = "DATA.xls"
    df = load_dataframe(file_path, preferred_sheet="Sheet2")
    if df is None:
        raise SystemExit(1)

    # 示例数据
    x = df['产品类别'].values
    y = df['年龄群体'].values
    z = df['销售金额'].values

    # 你的名字(将显示在图表上方)
    name = "张三"

    # 直接本地显示图表(不通过预览网址)
    plot_3d_bar(x, y, z, name)
    plot_sales_2d(df, '产品类别', 'T恤', '年龄群体', '销售金额', name)
    plot_radar(df, '产品类别', ['年龄群体'], '销售金额', ['20-24'], name)

把这段代码复制之后用下图方式粘贴到pycahrm运行,得到结果

图 34 在pycharm中编辑Python_DataAnalysis.py 文件的页面,鼠标左键单击编辑器中任意位置 ,出现光标 之后,使用全选 快捷键(同时按下ctrl键和a字母键 )然后按下粘贴 快捷键(同时按下ctrl键和v字母键 ),这样改好的代码就粘贴到了Python_DataAnalysis.py文件中,然后点击运行按钮

图 35 点击运行按钮,发现图标运行出来了,整个3d效果很不错,点击关闭按钮可以看到后面的图片

图 36 注意到图表名字是张三,还没有学号和头衔,下一步就是修改代码,改头衔和学号

图 38 进入pycharm中编辑Python_DataAnalysis.py 文件的页面,鼠标左键 单击,出现光标 之后,使用搜素 快捷键(同时按下ctrl键和f字母键 ),召唤出来图中框选的搜索栏(搜索栏输入器中可以快速检索想要查找的代码字段)

图 39 鼠标左键单击输入框,输入张三 ,pycharm自动检索到了张三 ,然后我们鼠标左键双击选中代码中的张三,并进行修改

图 40 修改之后要注意双引号是英文的,双引号里面的内容可以随便修改,这行代码 name = "法外狂徒:张三 学号:202500000000" 的意思就是说:把 "法外狂徒:张三 学号:202500000000" 这个 使用赋值号(=号,在数学里是相等的意思,在代码里面这叫赋值符号 )赋值给变量名为 name 的变量,传递这个变量打印在图表中就会在图表中显示对应的变量内容

修改之后点击运行,发现图表中的名字已然发生改变,张三 成功成为法外狂徒,并打上了坐牢编号 到这里,实验三的实验1部分内容已经完成

六、修改代码实现对图像进行缩放、旋转、模糊边缘等操作

代码已经编辑好,复制之后粘贴到编辑器运行可直接食用,哈哈

python 复制代码
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体,解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False

def show_image(image_data, figsize, title, cmap=None, is_bgr=True, name_and_id=None):
    """
    显示图像
    :param image_data: 图像数据
    :param figsize: 图像显示大小
    :param title: 图像标题
    :param cmap: 颜色映射(彩色图像通常不需要设置)
    :param is_bgr: 传入的是OpenCV读取的BGR彩色图像,自动转换为RGB显示
    :param name_and_id: 显示在标题上的名字和学号
    """
    plt.figure(figsize=figsize)
    if image_data is None:
        raise ValueError('show_image 接收到空图像数据')
    if image_data.ndim == 2:
        plt.imshow(image_data, cmap=cmap or 'gray')
    elif image_data.ndim == 3:
        if is_bgr:
            image_data = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)
        plt.imshow(image_data)
    else:
        raise ValueError('不支持的图像维度')
    if name_and_id:
        plt.title(f"{name_and_id} - {title}")
    else:
        plt.title(title)
    plt.axis('off')
    plt.show()

def _resolve_image_path(image_path):
    """
    解析图像路径:若不存在则尝试使用同目录下的 test.jpg。
    """
    if image_path and os.path.exists(image_path):
        return image_path
    fallback = os.path.join(os.path.dirname(__file__), 'test.jpg')
    if os.path.exists(fallback):
        print(f"未找到指定图片,改用默认: {fallback}")
        return fallback
    raise FileNotFoundError(f"找不到图像文件:{image_path},且默认文件不存在: {fallback}")

def load_image(image_path, flags=cv2.IMREAD_COLOR):
    """
    读取图像并进行空值校验;失败时抛出清晰错误。
    """
    resolved = _resolve_image_path(image_path)
    img = cv2.imread(resolved, flags)
    if img is None:
        raise FileNotFoundError(f"无法读取图像:{resolved}。请检查路径或文件完整性。")
    return img

def detect_edges(image_path, image_data=None, frame_color=[0, 255, 0]):
    """
    边缘检测
    :param image_path: 图像路径
    :param image_data: 可选,直接传入图像数据
    :param frame_color: 边缘颜色,默认为绿色
    :return: 带有边缘的图像
    """
    if image_data is None:
        image = load_image(image_path)
    else:
        image = image_data

    # Canny边缘检测
    edges = cv2.Canny(image, 100, 200)

    # 在原图上绘制边缘
    image_with_edges = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_with_edges[edges != 0] = frame_color
    return image_with_edges

def resize_image(image_path, width, height, name_and_id):
    """
    图像缩放
    :param image_path: 图像路径
    :param width: 新宽度
    :param height: 新高度
    :param name_and_id: 显示在标题上的名字和学号
    :return: 缩放后的图像
    """
    image = load_image(image_path)
    resized_image = cv2.resize(image, (width, height))
    show_image(resized_image, (10, 5), 'Resized Image', is_bgr=True, name_and_id=name_and_id)

def rotate_image(image_path, degree, name_and_id):
    """
    图像旋转
    :param image_path: 图像路径
    :param degree: 旋转角度
    :param name_and_id: 显示在标题上的名字和学号
    :return: 旋转后的图像
    """
    image = load_image(image_path)
    center = (image.shape[1] // 2, image.shape[0] // 2)
    rotation_matrix = cv2.getRotationMatrix2D(center, degree, 1)
    rotated_image = cv2.warpAffine(image, rotation_matrix, (image.shape[1], image.shape[0]))
    show_image(rotated_image, (10, 5), 'Rotated Image', is_bgr=True, name_and_id=name_and_id)

def blur_image(image_path, filter_size, name_and_id):
    """
    图像模糊
    :param image_path: 图像路径
    :param filter_size: 模糊过滤器大小
    :param name_and_id: 显示在标题上的名字和学号
    :return: 模糊后的图像
    """
    image = load_image(image_path)
    blurred_image = cv2.blur(image, (filter_size, filter_size))
    gaussian_blurred_image = cv2.GaussianBlur(image, (filter_size, filter_size), 0)
    plt.figure(figsize=(10, 5))
    plt.subplot(1, 3, 1)
    plt.title('Original Image')
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    plt.subplot(1, 3, 2)
    plt.title('Mean Blurred Image')
    plt.imshow(cv2.cvtColor(blurred_image, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    plt.subplot(1, 3, 3)
    plt.title('Gaussian Blurred Image')
    plt.imshow(cv2.cvtColor(gaussian_blurred_image, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    if name_and_id:
        plt.suptitle(name_and_id)
    plt.show()

def convert_color(image_path, name_and_id):
    """
    图像色彩转换
    :param image_path: 图像路径
    :param name_and_id: 显示在标题上的名字和学号
    :return: 转换后的图像
    """
    image = load_image(image_path)
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    plt.figure(figsize=(10, 5))
    plt.subplot(1, 3, 1)
    plt.title('Original Image')
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    plt.subplot(1, 3, 2)
    plt.title('Gray Image')
    plt.imshow(gray_image, cmap='gray')
    plt.axis('off')
    plt.subplot(1, 3, 3)
    plt.title('HSV Image')
    plt.imshow(hsv_image)
    plt.axis('off')
    if name_and_id:
        plt.suptitle(name_and_id)
    plt.show()

def equalize_image(image_path, name_and_id):
    """
    图像均衡化
    :param image_path: 图像路径
    :param name_and_id: 显示在标题上的名字和学号
    :return: 均衡化后的图像
    """
    image = load_image(image_path, cv2.IMREAD_GRAYSCALE)
    equalized_image = cv2.equalizeHist(image)
    plt.figure(figsize=(10, 5))
    plt.subplot(1, 2, 1)
    plt.title('Original Image')
    plt.imshow(image, cmap='gray')
    plt.axis('off')
    plt.subplot(1, 2, 2)
    plt.title('Equalized Image')
    plt.imshow(equalized_image, cmap='gray')
    plt.axis('off')
    if name_and_id:
        plt.suptitle(name_and_id)
    plt.show()

def binary_image(image_path, thresh, maxval=255, name_and_id=''):
    """
    图像二值化
    :param image_path: 图像路径
    :param thresh: 阈值
    :param maxval: 最大值,默认为255
    :param name_and_id: 显示在标题上的名字和学号
    :return: 二值化后的图像
    """
    image = load_image(image_path, cv2.IMREAD_GRAYSCALE)
    _, binary_image = cv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)
    plt.imshow(binary_image, cmap='gray')
    if name_and_id:
        plt.title(f'{name_and_id} - Binary Image')
    else:
        plt.title('Binary Image')
    plt.axis('off')
    plt.show()

if __name__ == '__main__':
    # 示例使用:默认读取同目录的 test.jpg(已提供)。
    image_path = 'test.jpg'
    name_and_id = "张三 - 20230001"  # 替换为您的名字和学号

    resize_image(image_path, 300, 200, name_and_id)  # 缩放图像
    rotate_image(image_path, 45, name_and_id)        # 旋转图像
    blur_image(image_path, 5, name_and_id)           # 模糊图像
    convert_color(image_path, name_and_id)           # 色彩转换
    equalize_image(image_path, name_and_id)          # 图像均衡化
    binary_image(image_path, 127, name_and_id=name_and_id)       # 图像二值化
    edges_img = detect_edges(image_path)
    show_image(edges_img, (10, 5), 'Edges', is_bgr=False, name_and_id=name_and_id)

图 41 双击左侧项目目录(也称文件夹 )下面的Python_ImageProcess.py 代码文件,进入编辑器页面,鼠标左键单击编辑器中任意位置 ,出现光标 之后,使用全选 快捷键(同时按下ctrl键和a字母键 )然后按下粘贴 快捷键(同时按下ctrl键和v字母键 ),这样改好的代码就粘贴到了Python_ImageProcess.py文件中

图 41 双击左侧项目目录(也称文件夹 )下面的Python_ImageProcess.py 代码文件,进入编辑器页面,鼠标左键单击编辑器中任意位置 ,出现光标 之后,鼠标右键悬浮窗中有 Run 'Python_ImageProcess' 的字样(这是运行Python_ImageProcess文件的意思 ),单击这个字样按钮,控制台输出如图红色错误,这是因为我们的python解释器发现缺乏代码中需要使用到的cv2包(也称 ),这种情况就需要安装对应的包和库

图 42 点击终端按钮进入终端,在命令行输入安装opencv库(也称)的代码,这里代码有点长我直接给出代码块(示例教程图42 里面的代码和下面有一点区别,下面代码块里面是清华的镜像源,因为外网的地址下载会出错,所以使用国内允许的这个镜像源地址)

python 复制代码
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

复制之后用粘贴 快捷键(同时按下ctrl 键和v 字母键)粘贴到终端命令行窗口即可,然后点击enter键,安装代码开始自动运行

图 43 看到这个提示说明已经安装opencv库(也称)成功了,然后点击运行按钮

图 44 运行效果非常炸裂,但是还要给图片加上自己的名字

图 45 同样的替换名字学号的步骤,双击Python_ImageProcess.py 文件进入pycharm的代码编辑器页面,然后使用搜索 快捷键(同时按下ctrl 键和f字母 键),在搜索栏输入张三,找到指定变量,修改名字和内容,然后点击运行按钮即可

有疑问欢迎评论留言,还是要多练习,祝各位道友加油!学弟学妹加油!哈哈

相关推荐
Highcharts.js1 小时前
在Python中配置高度交互的数据可视化:Highcharts完全指南
开发语言·python·信息可视化·highcharts
韩立学长4 小时前
【开题答辩实录分享】以《证劵数据可视化分析项目设计与实现》为例进行答辩实录分享
python·信息可视化·vue
qiao若huan喜6 小时前
9、webgl 基本概念 + 复合变换 + 平面内容复习
前端·javascript·信息可视化·webgl
权泽谦15 小时前
R Shiny 交互式网页实战:从零到上线可视化应用
开发语言·信息可视化·r语言
qiaochuanbiao17 小时前
用Echarts实现“庖丁解牛”的效果
信息可视化
陈辛chenxin1 天前
【大数据技术06】大数据技术
大数据·hadoop·分布式·python·信息可视化
java1234_小锋2 天前
[免费]基于Python的农产品可视化系统(Django+echarts)【论文+源码+SQL脚本】
python·信息可视化·django·echarts
Macbethad3 天前
数据可视化的实现方法
信息可视化
汤姆yu3 天前
基于大数据的信贷风险评估的数据可视化分析与预测系统
大数据·信息可视化