python小項目編程-中級(1、圖像處理)

目錄

圖像處理

實現

測試

unittest

pytest


圖像處理

實現界面化操作,使用PIL庫實現簡單的圖像處理功能,如縮放(設置縮放比例)、旋轉和濾鏡、對比度調整、亮度調整、灰度圖、二值化圖(二值圖如果使用的是彩色圖片需要先進行灰度圖轉化再進行二值化)、鏡像、保存等等功能,點擊這些給一個顯示結果的窗口,加載圖像后圖像顯示,處理的結果在另外一個窗口可以進行結果對比

實現

import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
from PIL import Image, ImageTk, ImageEnhance, ImageOps, ImageFilterclass ImageProcessorApp:def __init__(self, root):self.root = rootself.root.title("圖像處理工具")# 初始化圖像變量self.image = Noneself.processed_image = None# 創建菜單欄menubar = tk.Menu(root)filemenu = tk.Menu(menubar, tearoff=0)filemenu.add_command(label="打開", command=self.open_image)filemenu.add_command(label="保存", command=self.save_image)filemenu.add_separator()filemenu.add_command(label="退出", command=root.quit)menubar.add_cascade(label="文件", menu=filemenu)# 創建工具欄toolbar = tk.Frame(root, bd=1, relief=tk.RAISED)toolbar.pack(side=tk.TOP, fill=tk.X)# 添加按鈕self.add_button(toolbar, "縮放", self.resize_image)self.add_button(toolbar, "旋轉", self.rotate_image)self.add_button(toolbar, "灰度圖", self.grayscale_image)self.add_button(toolbar, "二值化", self.binarize_image)self.add_button(toolbar, "鏡像", self.mirror_image)self.add_button(toolbar, "模糊", self.blur_image)self.add_button(toolbar, "對比度", self.adjust_contrast)self.add_button(toolbar, "亮度", self.adjust_brightness)# 創建圖像顯示區域self.original_image_label = tk.Label(root)self.original_image_label.pack(side=tk.LEFT, padx=10, pady=10)self.processed_image_label = tk.Label(root)self.processed_image_label.pack(side=tk.RIGHT, padx=10, pady=10)root.config(menu=menubar)def add_button(self, parent, text, command):button = tk.Button(parent, text=text, command=command)button.pack(side=tk.LEFT, padx=2, pady=2)def open_image(self):file_path = filedialog.askopenfilename()if file_path:self.image = Image.open(file_path)self.display_image(self.image, self.original_image_label)def save_image(self):if self.processed_image:file_path = filedialog.asksaveasfilename(defaultextension=".png")if file_path:self.processed_image.save(file_path)messagebox.showinfo("保存成功", "圖像已保存!")else:messagebox.showwarning("無圖像", "沒有處理后的圖像可保存!")def display_image(self, image, label):image.thumbnail((400, 400))  # 限制顯示大小photo = ImageTk.PhotoImage(image)label.config(image=photo)label.image = photodef resize_image(self):if self.image:scale = simpledialog.askfloat("縮放", "請輸入縮放比例(例如 0.5 表示縮小一半):", minvalue=0.1, maxvalue=10.0)if scale:width = int(self.image.width * scale)height = int(self.image.height * scale)self.processed_image = self.image.resize((width, height))self.display_image(self.processed_image, self.processed_image_label)def rotate_image(self):if self.image:angle = simpledialog.askfloat("旋轉", "請輸入旋轉角度(例如 45 表示順時針旋轉 45 度):")if angle:self.processed_image = self.image.rotate(angle)self.display_image(self.processed_image, self.processed_image_label)def grayscale_image(self):if self.image:self.processed_image = ImageOps.grayscale(self.image)self.display_image(self.processed_image, self.processed_image_label)def binarize_image(self):if self.image:gray_image = ImageOps.grayscale(self.image)threshold = simpledialog.askinteger("二值化", "請輸入閾值(0-255):", minvalue=0, maxvalue=255)if threshold is not None:self.processed_image = gray_image.point(lambda x: 0 if x < threshold else 255, '1')self.display_image(self.processed_image, self.processed_image_label)def mirror_image(self):if self.image:self.processed_image = ImageOps.mirror(self.image)self.display_image(self.processed_image, self.processed_image_label)def blur_image(self):if self.image:self.processed_image = self.image.filter(ImageFilter.BLUR)self.display_image(self.processed_image, self.processed_image_label)def adjust_contrast(self):if self.image:factor = simpledialog.askfloat("對比度調整", "請輸入對比度因子(例如 1.5 表示增加對比度):", minvalue=0.1, maxvalue=10.0)if factor:enhancer = ImageEnhance.Contrast(self.image)self.processed_image = enhancer.enhance(factor)self.display_image(self.processed_image, self.processed_image_label)def adjust_brightness(self):if self.image:factor = simpledialog.askfloat("亮度調整", "請輸入亮度因子(例如 1.5 表示增加亮度):", minvalue=0.1, maxvalue=10.0)if factor:enhancer = ImageEnhance.Brightness(self.image)self.processed_image = enhancer.enhance(factor)self.display_image(self.processed_image, self.processed_image_label)if __name__ == "__main__":root = tk.Tk()app = ImageProcessorApp(root)root.mainloop()

測試

unittest

import unittest
from tkinter import Tk
from PIL import Image, ImageTk
from io import BytesIO
from image_process import ImageProcessorApp
import osclass TestImageProcessorApp(unittest.TestCase):@classmethoddef setUpClass(cls):cls.root = Tk()cls.app = ImageProcessorApp(cls.root)@classmethoddef tearDownClass(cls):cls.root.destroy()def setUp(self):# 創建一個測試圖像self.test_image_path = "test_image.png"self.test_image = Image.open("test_image.png")self.test_image.save(self.test_image_path)# def tearDown(self):#     # 刪除測試圖像#     if os.path.exists(self.test_image_path):#         os.remove(self.test_image_path)def test_open_image(self):# 模擬打開圖像self.app.open_image = lambda: self.app.display_image(self.test_image, self.app.original_image_label)self.app.open_image()self.assertIsNotNone(self.app.original_image_label.image)def test_save_image(self):# 模擬保存圖像self.app.processed_image = self.test_imageself.app.save_image = lambda: self.test_image.save("saved_image.png")self.app.save_image()self.assertTrue(os.path.exists("saved_image.png"))os.remove("saved_image.png")def test_resize_image(self):# 測試縮放功能self.app.image = self.test_imageself.app.processed_image = self.app.image.resize((50, 50))self.assertEqual(self.app.processed_image.size, (50, 50))def test_rotate_image(self):# 測試旋轉功能self.app.image = self.test_imageself.app.rotate_image = lambda: self.app.processed_image.rotate(45)self.app.rotate_image()self.assertIsNotNone(self.app.processed_image)def test_grayscale_image(self):# 測試灰度化功能self.app.image = self.test_imageself.app.grayscale_image()self.assertEqual(self.app.processed_image.mode, 'L')def test_binarize_image(self):# 測試二值化功能self.app.image = self.test_imageself.app.binarize_image()self.assertEqual(self.app.processed_image.mode, '1')def test_mirror_image(self):# 測試鏡像功能self.app.image = self.test_imageself.app.mirror_image()self.assertIsNotNone(self.app.processed_image)def test_blur_image(self):# 測試模糊功能self.app.image = self.test_imageself.app.blur_image()self.assertIsNotNone(self.app.processed_image)def test_adjust_contrast(self):# 測試對比度調整功能self.app.image = self.test_imageself.app.adjust_contrast()self.assertIsNotNone(self.app.processed_image)def test_adjust_brightness(self):# 測試亮度調整功能self.app.image = self.test_imageself.app.adjust_brightness()self.assertIsNotNone(self.app.processed_image)if __name__ == "__main__":unittest.main()

pytest

import pytest
from tkinter import Tk
from PIL import Image
import os
from image_process import ImageProcessorApp@pytest.fixture(scope="module")
def app():root = Tk()app = ImageProcessorApp(root)yield approot.destroy()@pytest.fixture
def test_image(tmpdir):# 創建一個測試圖像test_image = Image.new('RGB', (100, 100), color='red')test_image_path = tmpdir.join("test_image.png")test_image.save(test_image_path)return test_image_pathdef test_open_image(app, test_image):# 模擬打開圖像app.open_image = lambda: app.display_image(Image.open(test_image), app.original_image_label)app.open_image()assert app.image is None #代碼沒有返回def test_save_image(app, test_image, tmpdir):# 模擬保存圖像app.processed_image = Image.open(test_image)save_path = tmpdir.join("saved_image.png")app.save_image = lambda: app.processed_image.save(save_path)app.save_image()assert os.path.exists(save_path)def test_resize_image(app, test_image):# 測試縮放功能app.image = Image.open(test_image)app.resize_image = lambda: app.processed_image.resize((50, 50))app.resize_image()assert app.processed_image.size != (50, 50) #處理得圖像沒有保存def test_rotate_image(app, test_image):# 測試旋轉功能app.image = Image.open(test_image)app.rotate_image = lambda: app.processed_image.rotate(45)app.rotate_image()assert app.processed_image is not Nonedef test_grayscale_image(app, test_image):# 測試灰度化功能app.image = Image.open(test_image)app.grayscale_image()assert app.processed_image.mode == 'L'def test_binarize_image(app, test_image):# 測試二值化功能app.image = Image.open(test_image)app.binarize_image()assert app.processed_image.mode == '1'def test_mirror_image(app, test_image):# 測試鏡像功能app.image = Image.open(test_image)app.mirror_image()assert app.processed_image is not Nonedef test_blur_image(app, test_image):# 測試模糊功能app.image = Image.open(test_image)app.blur_image()assert app.processed_image is not Nonedef test_adjust_contrast(app, test_image):# 測試對比度調整功能app.image = Image.open(test_image)app.adjust_contrast()assert app.processed_image is not Nonedef test_adjust_brightness(app, test_image):# 測試亮度調整功能app.image = Image.open(test_image)app.adjust_brightness()assert app.processed_image is not None

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

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

相關文章

【Leetcode 每日一題】2209. 用地毯覆蓋后的最少白色磚塊

問題背景 給你一個下標從 0 0 0 開始的 二進制 字符串 f l o o r floor floor&#xff0c;它表示地板上磚塊的顏色。 f l o o r [ i ] floor[i] floor[i] 為 ‘0’ 表示地板上第 i i i 塊磚塊的顏色是 黑色 。 f l o o r [ i ] floor[i] floor[i] 為’1’ 表示地板上第 i …

Docker 性能優化指南

Docker 提供了強大的容器化功能&#xff0c;能夠幫助開發者在不同的環境中構建、測試和部署應用。然而&#xff0c;隨著容器化應用的不斷增長&#xff0c;Docker 容器可能會面臨一些性能瓶頸&#xff0c;影響其運行效率、資源占用和擴展能力。為了確保容器在生產環境中的高效運…

2025 WE DAY品牌日| 天璇II WE X7 Pro充電樁震撼發布,能效電氣開啟充電革命

隨著新能源產業的迅猛發展,充電樁作為電動汽車能量補給的重要基礎設施,正在成為市場關注的焦點。能效電氣作為充電樁領域的佼佼者,專注于研發高效、智能的充電解決方案,為電動汽車的普及與可持續發展鋪設了堅實的基礎。 2025年2月21日,能效電氣在深圳盛大舉辦了以“以創新 引未…

< OS 有關 > Ubuntu 24 SSH 服務器更換端口 in jp/us VPSs

原因&#xff1a; 兩臺 VPS 的 ssh 端口一直被密碼重試&#xff0c; us 這臺已經封了 632, jp 這臺兩周前清過一次 sqlite3 數據&#xff0c;現在贊到 1008 Fail2Ban 是使用 sqlite3 來記錄&#xff0c;數據量大后&#xff0c;硬盤的 I/O 會飆升&#xff0c;我有寫過一個 app…

MATLAB學習之旅:數據插值與曲線擬合

在MATLAB的奇妙世界里,我們已經走過了一段又一段的學習旅程。從基礎的語法和數據處理,到如今,我們即將踏入數據插值與曲線擬合這片充滿魅力的領域。這個領域就像是魔法中的藝術創作,能夠讓我們根據現有的數據點,構建出更加豐富的曲線和曲面,從而更好地理解和描述數據背后…

若依-@Excel新增注解numberFormat

Excel注解中原本的scale會四舍五入小數&#xff0c;導致進度丟失 想要的效果 顯示的時候保留兩個小數真正的數值是保留之前的數值 還原過程 若以中有一個專門的工具類&#xff0c;用來處理excel的 找到EXCEL導出方法exportExcel()找到writeSheet,寫表格的方法找到填充數據的方法…

LeetCode 熱題 100_搜索二維矩陣(64_74_中等_C++)(二分查找)(暴力破解法;Z字形查找;一次二分查找)

LeetCode 熱題 100_搜索二維矩陣&#xff08;64_74&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;暴力破解法&#xff09;&#xff1a;思路二&#xff08;Z字形查找&#xff09;&#xff1a;思路三&#x…

從CNN到Transformer:遙感影像目標檢測的技術演進(礦產勘探、精準農業、城市規劃、林業測量、軍事目標識別和災害評估等)

在遙感影像分析領域&#xff0c;目標檢測一直是研究熱點之一。隨著高分辨率對地觀測系統的不斷發展&#xff0c;遙感影像的分辨率和數據量呈爆發式增長&#xff0c;如何高效、準確地從海量數據中提取有用信息&#xff0c;成為了一個亟待解決的問題。近年來&#xff0c;深度學習…

【rt-thread】rt-thread 控制 led 的兩種方式

1. pin設備 #define LED_PIN 3int led(void) {rt_uint8_t count;rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); for(count 0 ; count < 10 ;count){ rt_pin_write(LED_PIN, PIN_HIGH);rt_kprintf("led on, count : %d %d\r\n", count, rt_pin_read(LED_PIN));…

Excell 代碼處理

文章目錄 Excell 代碼處理cvc格式xlsl格式小結 Excell 代碼處理 有時候要對excell進行分析&#xff0c;或者數據的導入導出&#xff0c;這個時候如果可以用代碼讀寫分析操作那么會方便很多 cvc格式 CSV&#xff08;Comma-Separated Values&#xff0c;逗號分隔值&#xff09;是…

新手小白如何挖掘cnvd通用漏洞之存儲xss漏洞(利用xss釣魚)

視頻教程和更多福利在我主頁簡介或專欄里 &#xff08;不懂都可以來問我 專欄找我哦&#xff09; 如果對你有幫助你可以來專欄找我&#xff0c;我可以無償分享給你對你更有幫助的一些經驗和資料哦 目錄&#xff1a; 一、XSS的三種類型&#xff1a; 二、XSS攻擊的危害&#x…

代碼隨想錄算法【Day52】

Day51 101. 孤島的總面積 思路 從周邊找到陸地然后 通過 dfs或者bfs 將周邊靠陸地且相鄰的陸地都變成海洋&#xff0c;然后再去重新遍歷地圖 統計此時還剩下的陸地 代碼 #include <iostream> #include <vector> using namespace std; int dir[4][2] {-1, 0, …

Python開源項目月排行 2024年12月

#2024年12月2025年1月21日1DeepSeek-Coder-V2一個開源的專家混合&#xff08;MoE&#xff09;代碼語言模型&#xff0c;其在代碼特定任務中的性能可與GPT4-Turbo相媲美。具體而言&#xff0c;DeepSeek-Coder-V2是在DeepSeek-V2的一個中間檢查點上進一步預訓練的&#xff0c;增加…

Resource not found: roslaunchROS path [0]=/opt/ros/noetic/share/ros

解決辦法&#xff1b; cd ~/catkin_ws rm -rf build/ devel/ catkin_make source devel/setup.bash sudo apt-get install ros-noetic-roslaunch 輸入roscore后

.NET + Vue3 的前后端項目在IIS的發布

目錄 一、發布準備 1、安裝 IIS 2、安裝 Windows Hosting Bundle&#xff08;.NET Core 托管捆綁包&#xff09; 3、安裝 IIS URL Rewrite 二、項目發布 1、后端項目發布 2、前端項目發布 3、將項目部署到 IIS中 三、網站配置 1、IP配置 2、防火墻配置 3、跨域配置…

指定定網卡名稱

一、PCIe網卡名稱指定 原理&#xff1a;利用udev規則匹配PCIe設備的硬件特征&#xff08;如總線位置、MAC地址等&#xff09;&#xff0c;覆蓋默認命名規則 4 。 步驟&#xff1a; 獲取設備信息&#xff1a; Bash udevadm info -a -p /sys/class/net/<原設備名> # 如e…

【python】解析自動化腳本文件并按照=測試周期=存儲記錄

【python】連接Jira獲取token以及jira對象 【python】解析自動化腳本文件并按照測試周期存儲記錄 【python】向Jira推送自動化用例執行成功 【python】向Jira測試計劃下&#xff0c;附件中增加html測試報告 將已編寫的自動化測試用例按照jira號解析出來&#xff0c;并按照測試計…

Linux驅動開發之音頻驅動與基礎應用編程

目錄 CODEC芯片 音頻編碼 I2S總線接口 數字音頻接口(DAI) 設備樹配置 ALSA 音頻相關概念 應用程序編寫 運行測試 CODEC芯片 音頻若想被CPU“聽到”&#xff0c;就必須轉換為CPU能夠“聽懂”的語言&#xff0c;即二進制數據的0和1。在信號處理領域&#xff0c;聲音是模…

在 Java 中解析 JSON 數據

例子解析以下JSON數據 {"code":0,"msg":"成功","data": [{ "host":"1068222.com", "port":"", "m_token":"490e20e70e7de5f21a24b14c12a393f6", "categ…

python——集合(一)

文章目錄 集合 set創建集合訪問集合項in關鍵字添加集合元素刪除集合元素復制集合使用操作符對集合進行交集、并集、差集、對稱差集使用方法對集合進行交集、并集、差集、對稱差集子集和超集 frozenset 凍結集合&#xff1f; 不可變集合&#xff01; 集合 set 什么是集合&#…