數據處理專題(十三)

學會基本的圖像處理技術。?

OpenCV 基礎

實踐:使用 OpenCV 進行圖像讀取、顯示和基本處理?

03

?

代碼示例

1. 導入必要的庫

import cv2import numpy as npimport matplotlib.pyplot as plt

2. 圖像讀取

# 讀取圖像image_path = 'path_to_your_image.jpg'  # 替換為你的圖像路徑image = cv2.imread(image_path)# 檢查圖像是否成功讀取if image is None:    print("圖像讀取失敗,請檢查路徑是否正確。")else:    print("圖像讀取成功!")

3. 圖像顯示

# 使用 OpenCV 顯示圖像cv2.imshow('原圖', image)cv2.waitKey(0)cv2.destroyAllWindows()# 使用 Matplotlib 顯示圖像plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('原圖')plt.axis('off')plt.show()

4. 圖像基本信息

# 獲取圖像的基本信息height, width, channels = image.shapeprint(f"圖像高度: {height} 像素")print(f"圖像寬度: {width} 像素")print(f"圖像通道數: {channels}")

5. 圖像灰度化???????

# 將圖像轉換為灰度圖像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 顯示灰度圖像cv2.imshow('灰度圖', gray_image)cv2.waitKey(0)cv2.destroyAllWindows()# 使用 Matplotlib 顯示灰度圖像plt.imshow(gray_image, cmap='gray')plt.title('灰度圖')plt.axis('off')plt.show()

6. 圖像裁剪???????

# 裁剪圖像cropped_image = image[100:400, 100:400]# 顯示裁剪后的圖像cv2.imshow('裁剪圖', cropped_image)cv2.waitKey(0)cv2.destroyAllWindows()# 使用 Matplotlib 顯示裁剪后的圖像plt.imshow(cv2.cvtColor(cropped_image, cv2.COLOR_BGR2RGB))plt.title('裁剪圖')plt.axis('off')plt.show()

7. 圖像縮放???????

# 縮放圖像resized_image = cv2.resize(image, (width // 2, height // 2))# 顯示縮放后的圖像cv2.imshow('縮放圖', resized_image)cv2.waitKey(0)cv2.destroyAllWindows()# 使用 Matplotlib 顯示縮放后的圖像plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))plt.title('縮放圖')plt.axis('off')plt.show()

8. 圖像旋轉???????

# 旋轉圖像center = (width // 2, height // 2)angle = 45scale = 1.0rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))# 顯示旋轉后的圖像cv2.imshow('旋轉圖', rotated_image)cv2.waitKey(0)cv2.destroyAllWindows()# 使用 Matplotlib 顯示旋轉后的圖像plt.imshow(cv2.cvtColor(rotated_image, cv2.COLOR_BGR2RGB))plt.title('旋轉圖')plt.axis('off')plt.show()

9. 圖像翻轉???????

# 翻轉圖像flipped_image = cv2.flip(image, 1)  # 1 表示水平翻轉,0 表示垂直翻轉,-1 表示水平和垂直翻轉# 顯示翻轉后的圖像cv2.imshow('翻轉圖', flipped_image)cv2.waitKey(0)cv2.destroyAllWindows()# 使用 Matplotlib 顯示翻轉后的圖像plt.imshow(cv2.cvtColor(flipped_image, cv2.COLOR_BGR2RGB))plt.title('翻轉圖')plt.axis('off')plt.show()

10. 圖像保存???????

# 保存處理后的圖像output_path = 'processed_image.jpg'cv2.imwrite(output_path, flipped_image)print(f"處理后的圖像已保存到 {output_path}")

04

?

實踐???????

import cv2import numpy as npimport matplotlib.pyplot as plt# 讀取圖像image_path = 'path_to_your_image.jpg'  # 替換為你的圖像路徑image = cv2.imread(image_path)# 檢查圖像是否成功讀取if image is None:    print("圖像讀取失敗,請檢查路徑是否正確。")else:    print("圖像讀取成功!")    # 使用 OpenCV 顯示圖像    cv2.imshow('原圖', image)    cv2.waitKey(0)    cv2.destroyAllWindows()    # 使用 Matplotlib 顯示圖像    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))    plt.title('原圖')    plt.axis('off')    plt.show()    # 獲取圖像的基本信息    height, width, channels = image.shape    print(f"圖像高度: {height} 像素")    print(f"圖像寬度: {width} 像素")    print(f"圖像通道數: {channels}")    # 將圖像轉換為灰度圖像    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    # 顯示灰度圖像    cv2.imshow('灰度圖', gray_image)    cv2.waitKey(0)    cv2.destroyAllWindows()    # 使用 Matplotlib 顯示灰度圖像    plt.imshow(gray_image, cmap='gray')    plt.title('灰度圖')    plt.axis('off')    plt.show()    # 裁剪圖像    cropped_image = image[100:400, 100:400]    # 顯示裁剪后的圖像    cv2.imshow('裁剪圖', cropped_image)    cv2.waitKey(0)    cv2.destroyAllWindows()    # 使用 Matplotlib 顯示裁剪后的圖像    plt.imshow(cv2.cvtColor(cropped_image, cv2.COLOR_BGR2RGB))    plt.title('裁剪圖')    plt.axis('off')    plt.show()    # 縮放圖像    resized_image = cv2.resize(image, (width // 2, height // 2))    # 顯示縮放后的圖像    cv2.imshow('縮放圖', resized_image)    cv2.waitKey(0)    cv2.destroyAllWindows()    # 使用 Matplotlib 顯示縮放后的圖像    plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))    plt.title('縮放圖')    plt.axis('off')    plt.show()    # 旋轉圖像    center = (width // 2, height // 2)    angle = 45    scale = 1.0    rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)    rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))    # 顯示旋轉后的圖像    cv2.imshow('旋轉圖', rotated_image)    cv2.waitKey(0)    cv2.destroyAllWindows()    # 使用 Matplotlib 顯示旋轉后的圖像    plt.imshow(cv2.cvtColor(rotated_image, cv2.COLOR_BGR2RGB))    plt.title('旋轉圖')    plt.axis('off')    plt.show()    # 翻轉圖像    flipped_image = cv2.flip(image, 1)  # 1 表示水平翻轉,0 表示垂直翻轉,-1 表示水平和垂直翻轉    # 顯示翻轉后的圖像    cv2.imshow('翻轉圖', flipped_image)    cv2.waitKey(0)    cv2.destroyAllWindows()    # 使用 Matplotlib 顯示翻轉后的圖像    plt.imshow(cv2.cvtColor(flipped_image, cv2.COLOR_BGR2RGB))    plt.title('翻轉圖')    plt.axis('off')    plt.show()    # 保存處理后的圖像    output_path = 'processed_image.jpg'    cv2.imwrite(output_path, flipped_image)    print(f"處理后的圖像已保存到 {output_path}")

05

總結

通過今天的練習,你應該已經學會了如何使用 OpenCV 進行基本的圖像處理,包括圖像讀取、顯示、灰度化、裁剪、縮放、旋轉和翻轉

數據管道

學會安裝和配置 Apache Airflow

使用 Airflow 構建一個簡單的數據處理管道

調度和監控任務?

01

?

目標

學會安裝和配置 Apache Airflow

使用 Airflow 構建一個簡單的數據處理管道

調度和監控任務?

02

?

步驟

1. 安裝 Apache Airflow

首先,我們需要安裝 Apache Airflow。可以使用 pip 來安裝:

pip install apache-airflow

2. 初始化 Airflow

初始化 Airflow 的數據庫和配置文件:

airflow db init

3. 啟動 Airflow Web 服務器

啟動 Airflow 的 Web 服務器,這樣我們可以在瀏覽器中監控和管理任務:

airflow webserver --port 8080

4. 啟動 Airflow Scheduler

啟動 Airflow 的調度器,它負責調度任務:

airflow scheduler

5. 創建 DAG 文件

DAG(Directed Acyclic Graph)是 Airflow 中的核心概念,表示一系列任務的依賴關系。我們將在 dags 目錄下創建一個 Python 文件來定義我們的 DAG。

假設我們有一個簡單的數據處理管道,包括以下幾個任務:

從 CSV 文件中讀取數據

清洗數據(處理缺失值和重復行)

按部門分組并計算每組的銷售額均值

將結果保存到新的 CSV 文件

創建一個名為 simple_data_pipeline.py 的文件,內容如下:???????

from airflow import DAGfrom airflow.operators.python_operator import PythonOperatorfrom datetime import datetime, timedeltaimport pandas as pdimport os# 定義默認參數default_args = {    'owner': 'airflow',    'depends_on_past': False,    'start_date': datetime(2023, 1, 1),    'retries': 1,    'retry_delay': timedelta(minutes=5),}# 創建 DAGdag = DAG(    'simple_data_pipeline',    default_args=default_args,    description='一個簡單的數據處理管道',    schedule_interval=timedelta(days=1),)# 定義任務函數def read_csv_file():    """從 CSV 文件中讀取數據"""    file_path = '/path/to/sales_data.csv'    df = pd.read_csv(file_path, encoding='utf-8-sig')    print(f"原始數據集: \n{df.head()}")    return dfdef clean_data(**context):    """清洗數據(處理缺失值和重復行)"""    df = context['ti'].xcom_pull(task_ids='read_csv_file')    # 檢查每列的缺失值數量    missing_values = df.isnull().sum()    print(f"每列的缺失值數量: \n{missing_values}")    # 刪除含有缺失值的行    df_cleaned = df.dropna()    print(f"刪除缺失值后的數據集: \n{df_cleaned.head()}")    # 檢查重復行    duplicates = df_cleaned.duplicated()    print(f"重復行: \n{duplicates}")    # 刪除重復行    df_no_duplicates = df_cleaned.drop_duplicates()    print(f"刪除重復行后的數據集: \n{df_no_duplicates.head()}")    return df_no_duplicatesdef group_and_calculate_mean(**context):    """按部門分組并計算每組的銷售額均值"""    df = context['ti'].xcom_pull(task_ids='clean_data')    # 按 '部門' 列分組    grouped_by_department = df.groupby('部門')    # 計算每組的銷售額均值    mean_sales_by_department = grouped_by_department['總價'].mean()    print(f"按 '部門' 列分組后,每組的銷售額均值: \n{mean_sales_by_department}")    return mean_sales_by_departmentdef save_results(**context):    """將結果保存到新的 CSV 文件"""    mean_sales_by_department = context['ti'].xcom_pull(task_ids='group_and_calculate_mean')    result_path = '/path/to/mean_sales_by_department.csv'    mean_sales_by_department.to_csv(result_path, encoding='utf-8-sig')    print(f"結果已保存到 {result_path}")# 定義任務read_csv_task = PythonOperator(    task_id='read_csv_file',    python_callable=read_csv_file,    dag=dag,)clean_data_task = PythonOperator(    task_id='clean_data',    python_callable=clean_data,    provide_context=True,    dag=dag,)group_and_calculate_mean_task = PythonOperator(    task_id='group_and_calculate_mean',    python_callable=group_and_calculate_mean,    provide_context=True,    dag=dag,)save_results_task = PythonOperator(    task_id='save_results',    python_callable=save_results,    provide_context=True,    dag=dag,)# 設置任務依賴關系read_csv_task >> clean_data_task >> group_and_calculate_mean_task >> save_results_task

6. 配置 Airflow

確保 dags 目錄在 Airflow 的配置文件中正確設置。通常情況下,Airflow 會自動檢測 dags 目錄下的 DAG 文件。

7. 運行和監控任務

打開瀏覽器,訪問 http://localhost:8080,登錄 Airflow 的 Web 界面。

在 DAG 列表中找到 simple_data_pipeline,點擊進入詳細頁面。

點擊 "Trigger Dag" 按鈕手動觸發任務,或者等待調度器自動運行任務。

在任務詳情頁面中,可以查看每個任務的運行狀態和日志。?

03

?

總結

通過今天的實踐,你應該已經學會了如何使用 Apache Airflow 構建一個簡單的數據處理管道。這個管道包括從 CSV 文件中讀取數據、清洗數據、按部門分組計算銷售額均值,并將結果保存到新的 CSV 文件。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905201.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot旅游小程序-計算機畢業設計源碼76696

目 錄 摘要 1 緒論 1.1研究背景與意義 1.2研究現狀 1.3論文結構與章節安排 2 基于微信小程序旅游網站系統分析 2.1 可行性分析 2.1.1 技術可行性分析 2.1.2 經濟可行性分析 2.1.3 法律可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統…

P1874 快速求和

目錄 題目算法標簽: 動態規劃, 線性 d p dp dp思路代碼 題目 P1874 快速求和 算法標簽: 動態規劃, 線性 d p dp dp 思路 求的是最少組成 n n n的加法次數, 對于當前數字序列可以設計狀態表示 f [ i ] [ j ] f[i][j] f[i][j]表示考慮前 i i i個字符, 并且和是 j j j的所有方…

知名人工智能AI培訓公開課內訓課程培訓師培訓老師專家咨詢顧問唐興通AI在金融零售制造業醫藥服務業創新實踐應用

AI賦能未來工作:引爆效率與價值創造的實戰營 AI驅動的工作革命:從效率提升到價值共創 培訓時長: 本課程不僅是AI工具的操作指南,更是面向未來的工作方式升級羅盤。旨在幫助學員系統掌握AI(特別是生成式AI/大語言模型…

Linux 內核參數

文章目錄 什么是內核參數參數種類配置方式1. 編譯內核時配置2. 內核啟動時配置3. 內核運行時配置4. 加載內核模塊時配置總結 什么是內核參數 內核參數是 Linux 系統中用于控制和調整內核行為的可配置選項。這些參數影響系統的性能、安全性和各種功能特性。 參數種類 大部分參…

pythonocc 拉伸特征

micromamba install -c conda-forge pythonocc-core opencascade.js安裝不起來,ai用pythonocc練個手 拉伸線框 線成面 from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Vec from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire f…

Vue.js 頁面切換空白與刷新 404 問題深度解析

在使用 Vue.js 開發單頁應用 (SPA) 的過程中,開發者經常會遇到兩個常見問題:頁面切換時出現短暫的空白屏幕,以及刷新頁面時返回 404 錯誤。這兩個問題不僅影響用戶體驗,還可能阻礙項目的正常上線。本文將深入探討這兩個問題的成因…

Go 語言 slice(切片) 的使用

序言 在許多開發語言中,動態數組是必不可少的一個組成部分。在實際的開發中很少會使用到數組,因為對于數組的大小大多數情況下我們是不能事先就確定好的,所以他不夠靈活。動態數組通過提供自動擴容的機制,極大地提升了開發效率。這…

Qt5.14.2 鏈接 MySQL 8.4 遇到的問題

問題一: "Plugin caching_sha2_password could not be loaded: 找不到指定的模塊。 Library path is caching_sha2_password.dll QMYSQL: Unable to connect" 解決方法: alter user root@localhost identified with mysql_native_password by root;問題二: ERR…

Docker 部署 - Crawl4AI 文檔 (v0.5.x)

Docker 部署 - Crawl4AI 文檔 (v0.5.x) 快速入門 🚀 拉取并運行基礎版本: # 不帶安全性的基本運行 docker pull unclecode/crawl4ai:basic docker run -p 11235:11235 unclecode/crawl4ai:basic# 帶有 API 安全性啟用的運行 docker run -p 11235:1123…

開發工具分享: Web前端編碼常用的在線編譯器

1.OneCompiler 工具網址:https://onecompiler.com/ OneCompiler支持60多種編程語言,在全球有超過1280萬用戶,讓開發者可以輕易實現代碼的編寫、運行和共享。 OneCompiler的線上調試功能完全免費,對編程語言的覆蓋也很全&#x…

Docker-配置私有倉庫(Harbor)

配置私有倉庫(Harbor) 一、環境準備安裝 Docker 三、安裝docker-compose四、準備Harbor五、配置證書六、部署配置Harbor七、配置啟動服務八、定制本地倉庫九、測試本地倉庫 Harbor(港灣),是一個用于 存儲 和 分發 Docker 鏡像的企業級 Regi…

關于高并發GIS數據處理的一點經驗分享

1、背景介紹 筆者過去幾年在參與某個大型央企的項目開發過程中,遇到了十分棘手的難題。其與我們平常接觸的項目性質完全不同。在一般的項目中,客戶一般只要求我們能夠通過桌面軟件對原始數據進行加工處理,將各類地理信息數據加工處理成地圖/場景和工作空間,然后再將工作空…

使用 DMM 測試 TDR

TDR(時域反射計)可能是實驗室中上升時間最快的儀器,但您可以使用直流歐姆表測試其準確性。 TDR 測量什么 在所有高速通道中,反射都很糟糕。我們嘗試設計一個通道來減少反射,這些反射都會導致符號間干擾 (…

可視化圖解算法37:序列化二叉樹-II

1. 題目 描述 請實現兩個函數,分別用來序列化和反序列化二叉樹,不對序列化之后的字符串進行約束,但要求能夠根據序列化之后的字符串重新構造出一棵與原二叉樹相同的樹。 二叉樹的序列化(Serialize)是指:把一棵二叉樹按照某種遍…

【Python】Python常用數據類型詳解

Python常用數據類型詳解:增刪改查全掌握 Python作為一門簡潔高效的編程語言,其豐富的數據類型是構建程序的基礎。本文將詳細介紹數字、字符串、列表、元組、字典、集合這六種核心數據類型的特點及增刪改查操作,并附代碼示例,助你全面掌握數據操作技巧。 一、數字(Number)…

模板引用、組件基礎

#### 組件基礎 1. 定義和使用簡單組件 - ![alt text](./img/image-2.png) vue <!-- 在App.vue里 --> <script setup>import HelloWorld from ./components/HelloWorld.vue </script> <template><HelloWorld></HelloWorld></temp…

深入探索 RKNN 模型轉換之旅

在人工智能蓬勃發展的當下&#xff0c;邊緣計算領域的應用愈發廣泛。瑞芯微的 RKNN 技術在這一領域大放異彩&#xff0c;它能讓深度學習模型在其芯片平臺上高效運行。而在整個應用流程中&#xff0c;模型轉換是極為關鍵的一環&#xff0c;今天就讓我們一同深入這個神奇的 RKNN …

iframe嵌套網站的安全機制實現

背景&#xff1a; 公司內部有一套系統A部署在內網&#xff0c;這套系統嵌套了B網站&#xff08;也是內網&#xff09;&#xff0c;只有內網才能訪問。現在需要將這個A系統暴露到公網。B系統的安全策略比較低&#xff0c;想快速上線并提高B系統的安全性。 通過 Nginx 代理層 設置…

青少年編程與數學 02-019 Rust 編程基礎 08課題、字面量、運算符和表達式

青少年編程與數學 02-019 Rust 編程基礎 08課題、字面量、運算符和表達式 一、字面量1. 字面量的分類1.1 整數字面量1.2 浮點數字面量1.3 字符字面量1.4 字符串字面量1.5 布爾字面量1.6 字節數組字面量 2. 字面量的類型推斷3. 字面量的用途4. 字面量的限制字面量總結 二、運算符…

危化品安全員職業發展方向的優劣對比

以下是危化品安全員不同職業發展方向的優劣對比&#xff1a; 縱向晉升 優勢 職業路徑清晰&#xff1a;從危化品安全員逐步晉升為安全主管、安全經理、安全總監等管理職位&#xff0c;層級明確&#xff0c;有較為清晰的上升通道。管理能力提升&#xff1a;隨著職位上升&#x…