返回文章列表

Python文字影像轉換與GUI自動化技術

本文探討使用 Python 進行文字影像轉換和 GUI 自動化的技術,涵蓋 Tesseract OCR 引擎、PyTesseract 函式庫、圖片預處理、NAPS2 應用程式,以及 PyAutoGUI 的滑鼠和鍵盤控制。文章提供實用的程式碼範例,示範如何進行圖片文字辨識、PDF

程式開發 網頁開發

Python 的豐富生態系提供許多工具,方便我們進行文字影像轉換和 GUI 自動化。影像轉換方面,Tesseract OCR 引擎搭配 PyTesseract 函式庫,可以有效地將圖片中的文字擷取出來,並應用於檔案數位化、資料分析等場景。實務上,圖片預處理步驟,例如二值化和去噪,能顯著提升 Tesseract 的辨識準確度。此外,NAPS2 應用程式簡化了產生帶有 OCR 文字的 PDF 檔案的流程。GUI 自動化方面,PyAutoGUI 函式庫允許我們模擬滑鼠點選、拖曳、滾動和鍵盤輸入等動作,結合螢幕截圖和畫素顏色比對,可以精確地控制應用程式,實作流程自動化。特別是在跨平臺應用上,需要根據不同作業系統調整 PyAutoGUI 的設定,例如 macOS 的無障礙許可權。瞭解視窗物件的屬性,例如大小、位置和標題,有助於更精確地操作視窗。

文字影像轉換技術

文字影像轉換是一種將圖片中的文字轉換為可編輯的文字內容的技術。這項技術在許多領域中都非常重要,例如檔案數位化、圖書掃描等。Python 是一種非常適合進行文字影像轉換的語言,因為它提供了許多強大的函式庫和工具來實作這項功能。

文字影像轉換的挑戰

文字影像轉換並不是一個簡單的任務,因為圖片中的文字可能會受到許多因素的影響,例如圖片的品質、字型的樣式、背景的複雜度等。尤其是當圖片是手寫或是印刷品時,文字影像轉換的準確度可能會受到很大的影響。

Tesseract 的應用

Tesseract 是一種非常強大的 OCR(Optical Character Recognition)引擎,它可以將圖片中的文字轉換為可編輯的文字內容。Tesseract 的優點在於它可以處理多種語言和字型,並且可以自動糾正一些常見的錯誤。

文字影像轉換的步驟

文字影像轉換的步驟通常包括以下幾個步驟:

  1. 圖片預處理:這一步驟包括旋轉圖片、調整亮度和對比度、去除噪點等,以提高圖片的品質。
  2. 文字識別:這一步驟使用 OCR 引擎來識別圖片中的文字。
  3. 錯誤糾正:這一步驟包括糾正一些常見的錯誤,例如字型的錯誤、間距的錯誤等。

使用 Python 進行文字影像轉換

Python 提供了許多強大的函式庫和工具來實作文字影像轉換。以下是一個簡單的範例:

import pytesseract as tess
from PIL import Image

# 開啟圖片
img = Image.open('frankenstein.png')

# 使用 Tesseract 進行文字識別
text = tess.image_to_string(img)

# 輸出識別結果
print(text)

大語言模型的應用

大語言模型(LLM)可以用來糾正一些 OCR 錯誤。以下是一個簡單的範例:

# 定義 LLM 的 prompt
prompt = "請糾正以下文字的錯誤:"

# 輸入需要糾正的文字
text = "Iv instead of IT"

# 使用 LLM 進行糾正
corrected_text = LLM(prompt + text)

# 輸出糾正結果
print(corrected_text)
圖表翻譯:

上述流程圖展示了文字影像轉換的步驟,包括圖片預處理、文字識別、錯誤糾正和輸出結果。

THE MODERN PROMETHEUS. 43 CHAPTER V. It was on a dreary night of November that I beheld the accomplishment of my toils. With an anxiety that almost amounted to agony, I collected the instruments of life around me, that I might infuse a spark of being into the lifeless thing that lay at my feet. It was already the morning; the rain pattered dismally against the panes, and my candle was nearly burnt out, when, by 玄貓, I saw the dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs. THE MODERN PROMETHEUS. 43 CHAPTER V. Iv was on a dreary night of November, that I beheld the accomplishment of my toils. With an anxiety that amounted to agony, I collected the instruments of life around me, that I might infuse a spark of being into the lifeless thing that lay at my feet. It was already the morning; the rain pattered dismally against the panes, and my candle was nearly burnt out, when, by 玄貓, I saw the dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs. THE MODERN PROMETHEUS. 43 CHAPTER V. It was on a dreary night of November that I beheld the accomplishment of my toils. With an anxiety that almost amounted to agony, I collected the instruments of life around me, that I might infuse a spark of being into the lifeless thing that lay at my feet. It was already the morning; the rain pattered dismally against the panes, and my candle was nearly burnt out, when, by 玄貓, I saw the dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs. Always remember that LLMs are prone to overconfidence. You should always verify their output. The text they return may have missed some mistakes, fixed the wrong kinds of mistakes, or even introduced new mistakes of their own. You’ll still need a human to review the machine output. (And you may want a second human to review the first human’s work, as humans often make mistakes too.) Recognizing Text in Non-English Languages Tesseract assumes the text it is scanning is English by default, but you can specify other languages as well. “Installing Tesseract and PyTesseract” on page 528 has instructions for installing non-English language packs. You can see the language packs you have installed by running tess.get_languages() in the interactive shell: »> import pytesseract as tess »> tess.get_languages() [‘afr’, ‘amh’, ‘ara’, ‘asm’, ‘aze’, ‘aze_cyrl’, ‘bel’, ‘ben’, ‘bos’, ‘bul’, ‘cat’, ‘ceb’, ‘ces’, ‘chi_sim’, ‘chi_tra’, ‘chr’, ‘cym’, ‘dan’, ‘deu’, ’ell’, ’eng’, ’enm’, ’epo’, ’est’, ’eus’, ‘fas’, ‘fin’, ‘fra’, ‘frk’, ‘frm’, ‘gle’, ‘glg’, ‘guj’, ‘hat’, ‘heb’, ‘hin’, ‘hrv’, ‘hun’, ‘hye’, ‘ind’, ‘isl’, ‘ita’, ‘jpn’, ‘kan’, ‘kat’, ‘kaz’, ‘khm’, ‘kor’, ’lav’, ’lit’, ’ltz’, ‘mal’, ‘mar’, ‘mkd’, ‘mlt’, ‘mon’, ‘mri’, ‘msa’, ‘mya’, ’nep’, ’nld’, ’nor’, ‘oci’, ‘ori’, ‘osd’, ‘pan’, ‘pol’, ‘por’, ‘pus’, ‘ron’, ‘rus’, ‘san’, ‘sin’, ‘slk’, ‘slv’, ‘spa’, ‘sqi’, ‘srp’, ‘srp_latn’, ‘swa’, ‘swe’, ’tam’, ’tel’, ’tgk’, ’tha’, ’tir’, ’ton’, ’tur’, ‘uig’, ‘ukr’, ‘urd’, ‘uzb’, ‘uzb_cyrl’] The strings in this list are mostly three-character ISO 639-3 language codes, with a few exceptions. For example, while ‘aze’ is the ISO 639-3 code for the Azeri language with Latin letters, the ‘aze_cyrl’ string is Azeri with Cyrillic letters. Consult the Tesseract documentation for full details. To scan images with non-English text, pass one of these string values for the lang keyword argument. For example, frankenstein_jpn.png has a Japanese translation of a section from Frankenstein. Download this file from the book’s online resources and enter the following into the interactive shell: »> import pytesseract as tess »> from PIL import Image »> img = Image.open(‘frankenstein_jpn.png’) »> text = tess.image_to_string(img, lang=‘jpn’) »> print(text) If you use the wrong language, image_to_string() returns Tesseract’s best guess as to what English characters the Japanese characters looked like. Of course, since the characters aren’t English, the returned text will be gibberish: To recognize text in multiple languages, you can combine language codes with a ‘+’ character before passing it to the image_to_string() function’s lang keyword argument. For example, tess.image_to_string(img, lang=‘eng+jpn’) recognizes both English and Japanese characters in an image. 第 5 剖 私が自分の労苦の成果を目の當たりにしたのは、11 月の芝鬱な夜でした。 痛に等しい不安を抱えながら、 私は足元に橫たわる生命のないものに存在の輝きを吹き込むために、 生命の器具を集めた。 それがすでに朝だった。 雨は窓ガラスに憂鬱な音を立てながら打ち付け、 私のローソクはほとんど燃え盡きていた。 そのとき、玄貓によって、私はあの生命のないものの目が開いたのを見た。 それは重い息をして、 強い運動がその四肢を激しく動かした。

使用NAPS2進行OCR檔案生成

NAPS2是一個開源的掃描應用程式,除了可以控制平板電腦掃描器外,也可以執行Tesseract並將文字新增到PDF檔案中。它免費、功能直觀,且可在Windows、macOS和Linux上使用。NAPS2可以將多個影像合併成一個PDF檔案,並嵌入文字,不需要連線物理掃描器。它還可以使用Tesseract的高階功能,將文字字串嵌入PDF頁面的正確位置,並可以從Python指令碼執行。

安裝和設定NAPS2

下載適合您作業系統的安裝程式。 在Windows和macOS上,執行下載的安裝程式。 在Linux上,下載Tesseract的Flatpak安裝程式。 然後,開啟終端視窗並執行flatpak install naps2-X.X.X-linux-x64.flatpak(或下載的安裝程式檔名)從下載目錄。您可能需要輸入管理員密碼以完成安裝。

安裝完成後,您可以執行NAPS2桌面應用程式。 在Windows上,您可以從開始選單選擇NAPS2。 在macOS上,您可以從Spotlight執行NAPS2。 在Linux上,您需要開啟新的終端視窗並執行flatpak run com.naps2.Naps2。然而,本文使用NAPS2從Python程式碼中使用子程式模組,而不是圖形使用者介面。

從Python執行NAPS2

Python指令碼可以使用子程式模組執行NAPS2應用程式,帶有多個命令列引數。這樣執行時,NAPS2不會顯示其應用程式視窗,這對於Python指令碼中的自動化步驟是理想的。

讓我們再次使用frankenstein.png影像,並讓NAPS2生成一個帶有嵌入OCR文字的PDF檔案。 NAPS2程式的位置在每個作業系統上都不同;以下的互動式shell程式碼顯示了Windows上的路徑:

import subprocess
naps2_path = [r'C:\Program Files\NAPS2\NAPS2.exe', 'console']
proc = subprocess.run(naps2_path + ['-i', 'frankenstein.png', '-o', 'output.pdf', '--install', 'ocr-eng', '--ocrlang', 'eng', '-n', '0', '-f', '-v'], capture_output=True)

在macOS上,替換設定路徑的行為如下:

naps2_path = ['/Applications/NAPS2.app/Contents/MacOS/NAPS2', 'console']

在Linux上,使用以下程式碼:

naps2_path = ['flatpak', 'run', 'com.naps2.Naps2', 'console']

程式碼建立了一個名為output.pdf的新檔案,其中包含一個頁面,具有從frankenstein.png掃描的影像。然而,如果您在PDF應用程式中開啟此檔案,您會注意到您可以突出顯示文字並將其複製到剪貼簿。許多PDF應用程式還允許您將PDF儲存為OCR文字的.txt檔案。

指定輸入

NAPS2允許您匯入PDF和大多數影像格式以建立最終合併的PDF。該應用程式具有自己的迷你語言,用於指定多個輸入作為單個命令列引數,該引數緊隨-i後面。這可以變得很複雜,但您可以將其視為以分號分隔,並具有Python索引和切片符號。

要指定多個檔案,請用分號分隔它們。例如,傳遞'-i', 'cat.png;dog.png;moose.png'會建立一個PDF,其中cat.png用於第一頁,dog.png用於第二頁,moose.png用於第三頁。

圖表翻譯:

內容解密:

上述程式碼使用NAPS2從Python指令碼生成PDF檔案,並嵌入OCR文字。程式碼指定輸入影像檔案、輸出PDF檔案、安裝英語語言包、設定英語作為OCR語言、指定不使用物理掃描器以及強制覆寫現有輸出檔案等引數。

圖片文字辨識技術應用

圖片文字辨識(Optical Character Recognition, OCR)是一種可以將圖片中的文字轉換為可編輯的數字文字的技術。這種技術可以節省大量的資料輸入時間,尤其是在需要處理大量檔案或圖片的場合。

Tesseract 文字辨識引擎

Tesseract 是一個開源的 OCR 引擎,廣泛被使用於各種應用中。它可以識別多種語言的文字,包括英文、中文、日文等。Tesseract 的識別率很高,但也需要圖片品質良好,否則識別率會降低。

PyTesseract 函式庫

PyTesseract 是一個 Python 函式庫,提供了一個簡單的方式來使用 Tesseract 引擎。它可以讓你輕鬆地將圖片中的文字轉換為可編輯的數字文字。

圖片預處理

在使用 OCR 技術之前,圖片預處理是非常重要的。圖片預處理可以提高 OCR 的識別率,尤其是在圖片品質不佳的情況下。常見的圖片預處理技術包括二值化、去噪等。

NAPS2 應用程式

NAPS2 是一個開源的應用程式,提供了一個簡單的方式來建立帶有嵌入式 OCR 文字的 PDF 檔案。它可以讓你輕鬆地將多個圖片合併成一個 PDF 檔案,並嵌入 OCR 文字。

練習題目

  1. Tesseract 可以識別哪些語言的文字?
  2. PyTesseract 支援哪些 Python 圖片函式庫?
  3. PyTesseract 的哪個函式可以接受一個圖片物件並傳回圖片中的文字?
  4. 如果你拍了一張街牌的照片,Tesseract 能夠識別出照片中的文字嗎?
  5. PyTesseract 的哪個函式可以傳回已安裝的語言包列表?
  6. 如果一個圖片包含英文和日文的文字,你需要指定哪個關鍵字引數給 PyTesseract?
  7. 哪個應用程式可以建立帶有嵌入式 OCR 文字的 PDF 檔案?

練習程式:瀏覽器文字擷取

有些網站允許你檢視其內容,但不允許你儲存或複製內容。你可以使用 PyAutoGUI 和 Pillow 函式庫來擷取網頁中的文字。PyAutoGUI 可以擷取螢幕畫面並儲存為圖片,Pillow 可以裁剪圖片。

下面是一個範例程式:

import pyautogui
import pytesseract
from PIL import Image

# TODO - 新增其他需要的匯入陳述式

# 文字區域的座標,需要根據實際情況調整
LEFT = 400
TOP = 200
WIDTH = 800
HEIGHT = 600

# 擷取螢幕畫面
image = pyautogui.screenshot(region=(LEFT, TOP, WIDTH, HEIGHT))

# 裁剪圖片
image = image.crop((0, 0, WIDTH, HEIGHT))

# 辨識圖片中的文字
text = pytesseract.image_to_string(image)

# 將辨識出的文字追加到 output.txt 檔案中
with open('output.txt', 'a') as f:
    f.write(text)

這個程式可以擷取網頁中的文字區域,裁剪圖片,然後使用 PyTesseract 辨識出圖片中的文字,並將辨識出的文字追加到 output.txt 檔案中。

控制鍵盤和滑鼠

瞭解各種Python套件用於編輯電子試算表、下載檔案和啟動程式是很有用的,但有時候,對於您需要合作的應用程式,可能沒有任何套件可用。在編輯電子試算表、下載檔案和啟動程式方面,控制鍵盤和滑鼠的程式是最終的自動化工具。這些程式可以將虛擬鍵盤按鍵和滑鼠點選傳送給其他應用程式,就像您自己坐在電腦前與應用程式互動一樣。

這種技術被稱為圖形使用者介面自動化,或簡稱GUI自動化。使用GUI自動化,您的程式可以做任何一位坐在電腦前的使用者能夠做的事情,除了將咖啡洩漏到鍵盤上。您可以將GUI自動化視為程式設計一個機器人手臂。您可以程式設計機器人手臂在您的鍵盤上輸入文字並為您移動滑鼠。這種技術對於涉及大量無腦點選或填寫表格的任務特別有用。這種強大的技術也是為什麼帳戶註冊和登入網頁具有機器人檢測captcha挑戰的原因。否則,自動化程式可以註冊多個免費帳戶,向社交媒體傳送垃圾郵件,或猜測帳戶密碼。

一些公司出售創新的(且昂貴的)“自動化解決方案”,通常將其作為機器人流程自動化(RPA)工具進行行銷。這些產品通常是根據Python的自動化工具,並附帶了圖形介面,以便非技術人員也能夠使用它們。但是,使用Python的pyautogui模組,您可以自己建立GUI自動化工具,而無需支付高昂的成本。

以下是使用pyautogui模組控制鍵盤和滑鼠的簡單範例:

import pyautogui

# 移動滑鼠到螢幕的右上角
pyautogui.moveTo(1000, 0)

# 在當前位置點選滑鼠
pyautogui.click()

# 輸入一串文字
pyautogui.typewrite('Hello, world!')

# 按下Enter鍵
pyautogui.press('enter')

這個範例展示瞭如何使用pyautogui模組控制鍵盤和滑鼠。您可以使用這個模組建立自己的GUI自動化工具,以自動化各種任務。

內容解密:

在上面的範例中,我們使用pyautogui模組控制鍵盤和滑鼠。moveTo()函式用於移動滑鼠到指定的位置,click()函式用於在當前位置點選滑鼠,typewrite()函式用於輸入一串文字,press()函式用於按下指定的鍵盤按鍵。

圖表翻譯:

這個圖表展示了上述範例中控制鍵盤和滑鼠的流程。

使用 PyAutoGUI 進行 GUI 自動化

PyAutoGUI 是一個 Python 函式庫,允許您模擬滑鼠和鍵盤動作。它的功能與使用 PyAutoGUI 函式庫建立的 Python 指令碼相似,該函式庫具有模擬滑鼠移動、按鈕點選和鍵盤輸入的功能。

設定 macOS 的無障礙應用程式

為了讓 PyAutoGUI 在 macOS 上正常運作,您需要將執行 Python 指令碼的程式設為無障礙應用程式。否則,PyAutoGUI 的功能呼叫將不會生效。您可以在「系統偏好設定」中找到無障礙選項,然後勾選 Mu、IDLE 或 Terminal 等應用程式,以允許它們控制您的電腦。

保持控制

在進行 GUI 自動化之前,您應該知道如何從可能出現的問題中還原。Python 可以以驚人的速度移動滑鼠和輸入按鍵。如果您的程式出了問題,但仍繼續移動滑鼠,則很難確定程式正在做什麼或如何還原。幸運的是,有幾種方法可以防止或從 GUI 自動化問題中還原。

暫停和失敗安全機制

如果您的程式有錯誤,您可以使用 PyAutoGUI 的失敗安全機制。快速將滑鼠移到螢幕的其中一個角落。每次 PyAutoGUI 函式呼叫後,都會暫停 0.1 秒,以便您有足夠的時間將滑鼠移到角落。如果 PyAutoGUI 發現滑鼠遊標在角落,則會引發 pyautogui.FailSafeException 例外。

滑鼠控制

在本文中,您將學習如何使用 PyAutoGUI 移動滑鼠並追蹤其在螢幕上的位置。但首先,您需要了解 PyAutoGUI 如何使用坐標。

PyAutoGUI 的滑鼠函式使用 x 和 y 座標。螢幕的座標系統類別似於影像的座標系統。原點(x 和 y 均為 0)位於螢幕的左上角。x 座標向右增加,y 座標向下增加。所有座標都是正整數。

移動滑鼠

pyautogui.moveTo() 函式可以瞬間將滑鼠遊標移動到螢幕上的指定位置。該函式的第一個和第二個引數分別是 x 和 y 座標。您可以使用 pyautogui.size() 函式取得螢幕的寬度和高度。

import pyautogui

# 取得螢幕大小
screen_size = pyautogui.size()

# 移動滑鼠到螢幕中心
pyautogui.moveTo(screen_size[0] / 2, screen_size[1] / 2)

使用 PyAutoGUI 進行滑鼠控制

PyAutoGUI 是一套 Python 函式庫,允許您控制滑鼠和鍵盤,模擬使用者輸入。以下是使用 PyAutoGUI 進行滑鼠控制的範例。

移動滑鼠

您可以使用 pyautogui.moveTo() 函式移動滑鼠到指定的座標。這個函式需要兩個引數:x 和 y 座標。例如:

import pyautogui

pyautogui.moveTo(100, 100)  # 移動滑鼠到 (100, 100) 座標

您也可以指定移動的時間,使用 duration 引數。例如:

pyautogui.moveTo(100, 100, duration=0.25)  # 移動滑鼠到 (100, 100) 座標,需時 0.25 秒

相對移動

您可以使用 pyautogui.move() 函式相對移動滑鼠。這個函式需要兩個引數:x 和 y 的變化量。例如:

import pyautogui

pyautogui.move(100, 0)  # 向右移動 100 畫素
pyautogui.move(0, 100)  # 向下移動 100 畫素
pyautogui.move(-100, 0)  # 向左移動 100 畫素
pyautogui.move(0, -100)  # 向上移動 100 畫素

取得當前滑鼠位置

您可以使用 pyautogui.position() 函式取得當前滑鼠位置。這個函式會傳回一個 Point 物件,包含 x 和 y 座標。例如:

import pyautogui

position = pyautogui.position()
print(position.x, position.y)  # 輸出當前滑鼠位置的 x 和 y 座標

範例程式

以下是使用 PyAutoGUI 移動滑鼠的範例程式:

import pyautogui
import time

for i in range(10):
    pyautogui.moveTo(100, 100, duration=0.25)
    pyautogui.moveTo(200, 100, duration=0.25)
    pyautogui.moveTo(200, 200, duration=0.25)
    pyautogui.moveTo(100, 200, duration=0.25)

這個程式會移動滑鼠在 (100, 100)、(200, 100)、(200, 200) 和 (100, 200) 座標之間,共 10 次。

圖表翻譯:

這個圖表展示了滑鼠移動的流程。

控制滑鼠互動

現在您知道如何移動滑鼠並判斷它在螢幕上的位置,您可以開始進行點選、拖曳和捲動等操作。

點選

要向電腦傳送虛擬滑鼠點選,可以呼叫 pyautogui.click() 方法。這個點選使用左滑鼠按鈕,並在滑鼠遊標目前所在的位置進行。您可以傳遞 x 和 y 座標作為可選的第一和第二個引數,如果您想要點選的位置與滑鼠目前的位置不同。

import pyautogui

# 取得目前滑鼠位置
print(pyautogui.position())

# 點選滑鼠
pyautogui.click()

如果您想要指定使用哪個滑鼠按鈕,可以包含 button 引數,值可以是 'left''middle''right'。例如,pyautogui.click(100, 150, button='left') 將在 (100, 150) 座標點選左滑鼠按鈕,而 pyautogui.click(200, 250, button='right') 將在 (200, 250) 座標點選右滑鼠按鈕。

拖曳

拖曳是指在按住滑鼠按鈕的情況下移動滑鼠。PyAutoGUI 提供了 pyautogui.dragTo()pyautogui.drag() 函式來拖曳滑鼠遊標到新的位置或相對於目前位置的位置。這些函式的引數與 moveTo()move() 相同:x 座標/水平移動、y 座標/垂直移動和可選的移動時間。

import pyautogui

# 拖曳滑鼠到新的位置
pyautogui.dragTo(100, 150, duration=0.2)

# 相對於目前位置拖曳滑鼠
pyautogui.drag(50, 0, duration=0.2)

範例:繪製螺旋圖案

以下範例程式碼使用 PyAutoGUI 繪製一個螺旋圖案:

import pyautogui

# 暫停 5 秒鐘讓使用者移動滑鼠到繪圖程式的視窗
pyautogui.sleep(5)

# 點選滑鼠使繪圖程式的視窗成為活躍視窗
pyautogui.click()

distance = 300
change = 20

while distance > 0:
    # 向右拖曳滑鼠
    pyautogui.drag(distance, 0, duration=0.2)
    distance -= change
    
    # 向下拖曳滑鼠
    pyautogui.drag(0, distance, duration=0.2)
    distance -= change
    
    # 向左拖曳滑鼠
    pyautogui.drag(-distance, 0, duration=0.2)
    distance -= change
    
    # 向上拖曳滑鼠
    pyautogui.drag(0, -distance, duration=0.2)
    distance -= change

圖表翻譯:

使用 PyAutoGUI 進行滑鼠控制

PyAutoGUI 是一款強大的 Python 函式庫,允許您控制滑鼠和鍵盤,以實作 GUI 自動化。以下是使用 PyAutoGUI 進行滑鼠控制的範例。

滑鼠移動

您可以使用 pyautogui.moveTo() 函式移動滑鼠到指定的位置。例如:

import pyautogui

# 移動滑鼠到 (100, 100) 的位置
pyautogui.moveTo(100, 100)

滑鼠拖曳

您可以使用 pyautogui.drag() 函式拖曳滑鼠。例如:

import pyautogui

# 拖曳滑鼠從 (100, 100) 到 (200, 200) 的位置
pyautogui.drag(100, 100, 200, 200, duration=0.2)

滑鼠滾動

您可以使用 pyautogui.scroll() 函式滾動滑鼠。例如:

import pyautogui

# 滾動滑鼠 200 個單位
pyautogui.scroll(200)

計劃滑鼠移動

如果您想要自動化滑鼠移動,您需要知道滑鼠要移動到的位置。PyAutoGUI 提供了 pyautogui.mouseInfo() 函式來幫助您找到滑鼠的位置。

pyautogui.mouseInfo() 函式會啟動一個名為 MouseInfo 的應用程式,該應用程式會顯示滑鼠的位置和顏色。您可以使用此應用程式來記錄滑鼠的位置和顏色。

截圖

PyAutoGUI 也提供了截圖功能。您可以使用 pyautogui.screenshot() 函式來擷取螢幕的截圖。例如:

import pyautogui

# 擷取螢幕的截圖
im = pyautogui.screenshot()

截圖後,您可以使用 Pillow 函式庫來處理截圖。

圖形化使用者介面自動化中的視覺驗證

在圖形化使用者介面自動化中,視覺驗證是一個非常重要的步驟。它可以幫助我們確保自動化指令碼是否正確地與使用者介面互動。其中一個常見的視覺驗證方法是透過檢查螢幕上特定畫素的顏色。

取得螢幕上特定畫素的顏色

PyAutoGUI 提供了一個 pixel() 函式,可以用來取得螢幕上特定畫素的顏色。這個函式需要兩個整數引數,分別代表 x 和 y 座標。它會傳回一個 RGB 元組,包含三個整數,分別代表紅、綠和藍色的強度。

import pyautogui

# 取得螢幕左上角畫素的顏色
color = pyautogui.pixel(0, 0)
print(color)  # 輸出:(176, 176, 175)

# 取得螢幕 (50, 200) 位置畫素的顏色
color = pyautogui.pixel(50, 200)
print(color)  # 輸出:(130, 135, 144)

檢查螢幕上特定畫素的顏色是否匹配

PyAutoGUI 還提供了一個 pixelMatchesColor() 函式,可以用來檢查螢幕上特定畫素的顏色是否匹配給定的顏色。這個函式需要三個引數:x 和 y 座標,以及一個 RGB 元組代表要匹配的顏色。

import pyautogui

# 檢查螢幕 (50, 200) 位置畫素的顏色是否匹配 (130, 135, 144)
match = pyautogui.pixelMatchesColor(50, 200, (130, 135, 144))
print(match)  # 輸出:True

# 檢查螢幕 (50, 200) 位置畫素的顏色是否匹配 (255, 135, 144)
match = pyautogui.pixelMatchesColor(50, 200, (255, 135, 144))
print(match)  # 輸出:False

圖片識別

如果您不知道 PyAutoGUI 該在哪裡點選,您可以使用圖片識別。PyAutoGUI 可以接收一個圖片檔案,並找到它在螢幕上的位置。

import pyautogui

# 尋找 submit.png 圖片在螢幕上的位置
box = pyautogui.locateOnScreen('submit.png')
print(box)  # 輸出:Box(left=643, top=745, width=70, height=29)

圖表翻譯:

此圖表示 PyAutoGUI 的 pixel()pixelMatchesColor() 函式,可以用來取得螢幕上特定畫素的顏色和檢查它是否匹配給定的顏色。同時,也展示瞭如何使用 locateOnScreen() 函式來找到圖片在螢幕上的位置。

使用 PyAutoGUI 進行影像識別和視窗操作

PyAutoGUI 是一個強大的 Python 函式庫,允許您控制滑鼠和鍵盤,同時也提供了影像識別功能。以下是如何使用 PyAutoGUI 進行影像識別和視窗操作的範例。

影像識別

PyAutoGUI 的 locateOnScreen() 函式可以用來在螢幕上找到特定影像的位置。這個函式會傳回一個 Box 物件,包含了影像在螢幕上的 x、y 座標、寬度和高度。

import pyautogui

try:
    location = pyautogui.locateOnScreen('submit.png')
    print(location)
except pyautogui.ImageNotFoundException:
    print('Image could not be found.')

如果影像在螢幕上出現多次,locateAllOnScreen() 函式會傳回一個 Generator 物件,包含了所有找到影像的位置。

import pyautogui

locations = list(pyautogui.locateAllOnScreen('submit.png'))
for location in locations:
    print(location)

視窗操作

一旦您找到影像的位置,您就可以使用 click() 函式來點選該位置。

import pyautogui

try:
    location = pyautogui.locateOnScreen('submit.png')
    pyautogui.click(location)
except pyautogui.ImageNotFoundException:
    print('Image could not be found.')

您也可以使用 moveTo()dragTo() 函式來移動滑鼠和拖曳影像。

import pyautogui

try:
    location = pyautogui.locateOnScreen('submit.png')
    pyautogui.moveTo(location)
    pyautogui.dragTo(location, duration=0.25)
except pyautogui.ImageNotFoundException:
    print('Image could not be found.')

視窗資訊

PyAutoGUI 也提供了取得視窗資訊的功能,包括視窗的標題、大小和位置。

import pyautogui

try:
    window_title = pyautogui.getActiveWindow().title
    print(window_title)
except Exception as e:
    print(e)

注意:PyAutoGUI 的視窗功能僅在 Windows 上可用,不支援 macOS 或 Linux。

視窗物件屬性

在使用 pyautogui 時,瞭解視窗的屬性是非常重要的。視窗物件(Window object)包含了許多有用的屬性,例如視窗的大小、位置、標題等。

視窗屬性列表

以下是視窗物件的屬性列表:

  • leftrighttopbottom:視窗邊緣的 x 或 y 坐標
  • toplefttoprightbottomleftbottomright:視窗角落的 (x, y) 坐標
  • midleftmidrightmidtopmidbottom:視窗邊緣中間點的 (x, y) 坐標
  • widthheight:視窗的寬度和高度(以畫素為單位)
  • size:視窗的大小(以 (寬度, 高度) 的形式表示)
  • area:視窗的面積(以畫素為單位)
  • center:視窗的中心點的 (x, y) 坐標
  • centerxcentery:視窗中心點的 x 或 y 坐標
  • box:視窗的盒子模型(以 (左, 上, 寬度, 高度) 的形式表示)
  • title:視窗的標題

取得視窗物件

要取得當前活躍視窗的視窗物件,可以使用 pyautogui.getActiveWindow() 函式。

import pyautogui
active_win = pyautogui.getActiveWindow()

取得視窗屬性

一旦你有了視窗物件,你就可以存取其屬性。例如:

print(active_win.title)  # 印出視窗的標題
print(active_win.size)  # 印出視窗的大小
print(active_win.left, active_win.top, active_win.right, active_win.bottom)  # 印出視窗的邊緣坐標

其他函式

除了 getActiveWindow() 之外,還有其他函式可以用來取得視窗物件:

  • pyautogui.getAllWindows():傳回所有可見視窗的視窗物件列表
  • pyautogui.getWindowsAt(x, y):傳回包含點 (x, y) 的所有可見視窗的視窗物件列表
  • pyautogui.getWindowsWithTitle(title):傳回所有標題為 title 的可見視窗的視窗物件列表

這些函式可以用來自動化與多個視窗互動的任務。

內容解密:

在這個章節中,我們學習瞭如何使用 pyautogui 來取得和操作視窗物件。視窗物件包含了許多有用的屬性,例如大小、位置和標題。透過使用這些屬性,我們可以自動化與多個視窗互動的任務。例如,我們可以使用 getActiveWindow() 來取得當前活躍視窗的視窗物件,然後使用其屬性來計算精確的坐標。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python文字影像轉換與GUI自動化技術

package "影像處理流程" {
    package "影像載入" {
        component [讀取影像] as read
        component [色彩空間轉換] as color
        component [尺寸調整] as resize
    }

    package "影像處理" {
        component [濾波器 Filter] as filter
        component [邊緣檢測 Edge] as edge
        component [形態學操作] as morph
        component [特徵提取] as feature
    }

    package "深度學習" {
        component [CNN 卷積網路] as cnn
        component [物件偵測] as detect
        component [影像分割] as segment
    }
}

read --> color : BGR/RGB/Gray
color --> resize : 縮放
resize --> filter : 平滑/銳化
filter --> edge : Sobel/Canny
edge --> feature : SIFT/ORB
feature --> cnn : 特徵學習
cnn --> detect : YOLO/RCNN
cnn --> segment : U-Net/Mask RCNN

note right of cnn
  卷積層提取特徵
  池化層降維
  全連接層分類
end note

@enduml

這個圖表展示瞭如何使用 pyautogui 來取得視窗物件和其屬性,然後使用這些屬性來自動化任務。

從商業價值的角度來看,文字影像轉換技術正迅速成為各行各業不可或缺的工具。透過 pytesseract 等 Python 函式庫以及 Tesseract OCR 引擎,企業能將大量紙本檔案數位化,大幅提升資料處理效率並降低人力成本。同時,結合大語言模型(LLM)進行後續錯誤修正,更能顯著提升轉換準確度,創造更高的商業價值。然而,技術限制依然存在,例如手寫文字或低品質圖片的辨識準確率仍有待提升。未來,隨著深度學習技術的持續發展,預期 OCR 技術將在辨識精確度、語言支援廣度以及處理速度上持續精進,並與雲端服務更緊密整合,為企業提供更便捷、高效的文字影像轉換解決方案。玄貓認為,企業應積極匯入此技術,並關注相關技術的演進,以充分發揮其商業潛力。