最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python在圖片上畫線的兩種主流方法

 更新時(shí)間:2026年04月20日 08:27:51   作者:detayun  
本文詳細(xì)介紹了使用Python在圖片上畫線的方法,主要使用了OpenCV和Pillow,首先介紹了準(zhǔn)備工作,包括安裝依賴庫(kù)和理解基本概念,如坐標(biāo)系和顏色通道,接著,本文詳細(xì)展示了使用Opencv和Pillow的方法畫線,最后,本文總結(jié)了兩種庫(kù)的特性和特點(diǎn),并給出了使用建議

在日常的編程工作中,我們經(jīng)常需要對(duì)圖像進(jìn)行處理。無(wú)論是給圖片加水印、標(biāo)注目標(biāo)檢測(cè)的邊框,還是簡(jiǎn)單的圖像編輯,“在圖片上畫線”都是最基礎(chǔ)也是最常用的操作之一。

今天,我們就來(lái)詳細(xì)聊聊如何使用 Python 在圖片上畫線。我們將主要使用兩個(gè)強(qiáng)大的庫(kù):OpenCVPillow (PIL)

一、 準(zhǔn)備工作:安裝依賴庫(kù)

在開始之前,請(qǐng)確保你已經(jīng)安裝了必要的庫(kù)。打開終端(Terminal 或 CMD),運(yùn)行以下命令:

# 安裝 OpenCV (推薦用于計(jì)算機(jī)視覺任務(wù))
pip install opencv-python numpy
# 安裝 Pillow (推薦用于簡(jiǎn)單的圖像處理)
pip install Pillow

二、 核心概念:坐標(biāo)系與顏色

在畫線之前,有兩個(gè)概念必須搞懂,否則你畫出的線可能會(huì)“消失”或者顏色不對(duì)。

  1. 坐標(biāo)系
    • 在計(jì)算機(jī)視覺中,圖像的左上角是原點(diǎn) (0, 0)。
    • X 軸向右增長(zhǎng),Y 軸向下增長(zhǎng)。
    • 坐標(biāo)格式通常是 (x, y) 或者 (列, 行)。
  2. 顏色通道
    • OpenCV 使用的是 BGR 格式(藍(lán)、綠、紅),而不是常見的 RGB。
    • Pillow 使用的是 RGB 格式。
    • 顏色值通常是 0-255 的整數(shù)元組,例如紅色在 OpenCV 中是 (0, 0, 255),在 Pillow 中是 (255, 0, 0)。

三、 方法一:使用 OpenCV (cv2) —— 專業(yè)且強(qiáng)大

OpenCV 是計(jì)算機(jī)視覺領(lǐng)域的行業(yè)標(biāo)準(zhǔn),功能極其豐富。

1. 基礎(chǔ)畫線:cv2.line()

這是最直接的方法。

import cv2
import numpy as np

# 1. 創(chuàng)建一張黑色的空白圖片 (高500, 寬500, 3通道)
# 注意:OpenCV 的 shape 順序是 (高度, 寬度, 通道數(shù))
image = np.zeros((500, 500, 3), dtype=np.uint8)

# 2. 定義起點(diǎn)和終點(diǎn)
start_point = (50, 50)   # (x, y)
end_point = (450, 450)

# 3. 定義顏色 (BGR格式:藍(lán)色)
color = (255, 0, 0) 

# 4. 定義線寬
thickness = 5

# 5. 畫線
cv2.line(image, start_point, end_point, color, thickness)

# 6. 顯示圖片
cv2.imshow("OpenCV Line", image)
cv2.waitKey(0)  # 等待按鍵
cv2.destroyAllWindows()

# 7. 保存圖片
cv2.imwrite("opencv_line.jpg", image)

2. 進(jìn)階玩法

A. 畫帶箭頭的線

OpenCV 甚至提供了現(xiàn)成的箭頭函數(shù):

# 在上面的代碼基礎(chǔ)上替換 cv2.line 為:
cv2.arrowedLine(image, (50, 100), (450, 100), (0, 255, 0), 5, tipLength=0.1)

B. 畫虛線/抗鋸齒線

cv2.line 默認(rèn)可能會(huì)有鋸齒。如果要更平滑的線(抗鋸齒),可以使用 cv2.LINE_AA 標(biāo)志(但在較新版本中,line_type 參數(shù)已被整合,通常高分辨率下直接畫即可,或者使用更復(fù)雜的繪制方法)。

如果你想畫虛線,OpenCV 沒有直接函數(shù),需要自己寫個(gè)小邏輯:

def draw_dashed_line(img, start, end, color, thickness=1, dash_len=10):
    x1, y1 = start
    x2, y2 = end
    dx, dy = x2 - x1, y2 - y1
    steps = max(abs(dx), abs(dy)) // dash_len
    if steps == 0: steps = 1
    for i in range(0, steps, 2): # 每隔一段畫一段
        t1 = i / steps
        t2 = (i + 1) / steps if (i + 1) < steps else 1.0
        p1 = (int(x1 + t1 * dx), int(y1 + t1 * dy))
        p2 = (int(x1 + t2 * dx), int(y1 + t2 * dy))
        cv2.line(img, p1, p2, color, thickness)

# 使用
draw_dashed_line(image, (50, 200), (450, 200), (0, 255, 255), 3)

C. 畫半透明線

OpenCV 畫半透明線稍微麻煩一點(diǎn),需要使用 cv2.addWeighted 進(jìn)行圖像混合:

overlay = image.copy()
cv2.line(overlay, (50, 300), (450, 300), (0, 0, 255), 10) # 紅色粗線
# 混合原圖和覆蓋層
cv2.addWeighted(overlay, 0.5, image, 0.5, 0, image)

四、 方法二:使用 Pillow (PIL) —— 輕量且直觀

如果你只是做簡(jiǎn)單的圖片編輯(如加水印、畫裝飾線),Pillow 的 API 更加 Pythonic,更容易上手。

from PIL import Image, ImageDraw

# 1. 創(chuàng)建一張白色背景的圖片
img = Image.new('RGB', (500, 500), color='white')

# 2. 創(chuàng)建一個(gè)可以在上面繪制的對(duì)象
draw = ImageDraw.Draw(img)

# 3. 定義坐標(biāo) [(x1, y1), (x2, y2)]
xy = [50, 50, 450, 450]

# 4. 定義顏色 (RGB格式:紅色) 和線寬
fill_color = (255, 0, 0)
width = 5

# 5. 畫線
draw.line(xy, fill=fill_color, width=width)

# 也可以連續(xù)畫多條線段
draw.line([(50, 100), (200, 100), (200, 200), (350, 200)], fill='blue', width=3, joint='curve')

# 6. 顯示圖片 (會(huì)調(diào)用系統(tǒng)默認(rèn)圖片查看器)
img.show()

# 7. 保存
img.save("pillow_line.jpg")

Pillow 的優(yōu)勢(shì)

  • 坐標(biāo)可以直接用列表 [(x1,y1), (x2,y2)],也支持連續(xù)點(diǎn)。
  • 顏色可以直接用英文單詞 'red', 'blue'
  • 支持 joint 參數(shù)讓折線拐角處變圓滑。

五、 實(shí)戰(zhàn)案例:給圖片打馬賽克(畫粗線覆蓋)

有時(shí)候我們需要遮擋圖片中的敏感信息(如車牌、人臉),最簡(jiǎn)單的方法就是在上面畫粗線或者矩形覆蓋。

需求:在圖片上畫一條黑色的粗橫線遮擋文字。

import cv2

# 讀取圖片
img = cv2.imread("test_image.jpg") # 替換成你的圖片路徑

# 定義遮擋區(qū)域的Y坐標(biāo)范圍
y_top = 100
y_bottom = 150

# 在這個(gè)區(qū)域內(nèi)畫黑色的粗線(實(shí)際上畫矩形更合適,但畫線也能模擬)
# 這里我們用循環(huán)畫多條線模擬粗線帶,或者直接用 rectangle
start_point = (0, y_top)
end_point = (img.shape[1], y_bottom) # img.shape[1] 是寬度

# 畫一個(gè)填充的矩形來(lái)遮擋
cv2.rectangle(img, start_point, end_point, (0, 0, 0), -1) # -1 表示填充

cv2.imshow("Censored", img)
cv2.waitKey(0)

六、 總結(jié)與建議

特性OpenCV (cv2)Pillow (PIL)
主要用途計(jì)算機(jī)視覺、視頻分析、復(fù)雜圖像算法基礎(chǔ)圖像處理、Web后端圖片生成、格式轉(zhuǎn)換
畫線函數(shù)cv2.line()ImageDraw.line()
顏色格式BGR (容易踩坑)RGB (符合直覺)
坐標(biāo)系(x, y) / (列, 行)(x, y)
性能極高 (C++底層)中等 (Python底層)
易用性稍復(fù)雜,參數(shù)多非常簡(jiǎn)單,API友好

我的建議

  • 如果你在做目標(biāo)檢測(cè)、人臉識(shí)別、視頻流處理,請(qǐng)無(wú)腦選擇 OpenCV
  • 如果你只是想給照片加個(gè)水印、生成驗(yàn)證碼、簡(jiǎn)單的裁剪縮放Pillow 會(huì)讓你寫得更開心。

以上就是使用Python在圖片上畫線的兩種主流方法的詳細(xì)內(nèi)容,更多關(guān)于Python在圖片上畫線的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python decorator攔截器代碼實(shí)例解析

    Python decorator攔截器代碼實(shí)例解析

    這篇文章主要介紹了Python decorator攔截器代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 通俗講解python 裝飾器

    通俗講解python 裝飾器

    這篇文章主要介紹了python 裝飾器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python裝飾器的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-09-09
  • 詳解Django解決ajax跨域訪問問題

    詳解Django解決ajax跨域訪問問題

    這篇文章主要介紹了詳解Django解決ajax跨域訪問問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-08-08
  • Python萬(wàn)字深入內(nèi)存管理講解

    Python萬(wàn)字深入內(nèi)存管理講解

    內(nèi)存管理是指在程序的運(yùn)行過程中,分配內(nèi)容和回收內(nèi)存的過程。如果只分配,不回收,電腦上那點(diǎn)內(nèi)存很快就被用光。幸運(yùn)的是,Python和Java等高級(jí)語(yǔ)言會(huì)自動(dòng)管理內(nèi)存的分配和回收
    2022-07-07
  • Python中數(shù)據(jù)清洗與處理的常用方法小結(jié)

    Python中數(shù)據(jù)清洗與處理的常用方法小結(jié)

    數(shù)據(jù)清洗與處理是數(shù)據(jù)分析的重要步驟,確保數(shù)據(jù)的準(zhǔn)確性和一致性,這篇文章為大家整理了Python中一些常用的數(shù)據(jù)清洗與處理方法,需要的可以參考下
    2025-02-02
  • python將txt等文件中的數(shù)據(jù)讀為numpy數(shù)組的方法

    python將txt等文件中的數(shù)據(jù)讀為numpy數(shù)組的方法

    今天小編就為大家分享一篇python將txt等文件中的數(shù)據(jù)讀為numpy數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-12-12
  • 基于Python新建用戶并產(chǎn)生隨機(jī)密碼過程解析

    基于Python新建用戶并產(chǎn)生隨機(jī)密碼過程解析

    這篇文章主要介紹了基于Python新建用戶并產(chǎn)生隨機(jī)密碼過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python基于多線程實(shí)現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫(kù)的方法

    Python基于多線程實(shí)現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Python基于多線程實(shí)現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了Python使用數(shù)據(jù)庫(kù)類與多線程類進(jìn)行數(shù)據(jù)抓取與寫入數(shù)據(jù)庫(kù)操作的具體使用技巧,需要的朋友可以參考下
    2018-06-06
  • Python圖像處理之給圖片添加圓角效果的完整代碼

    Python圖像處理之給圖片添加圓角效果的完整代碼

    在日常的圖像處理任務(wù)中,我們經(jīng)常需要對(duì)圖片進(jìn)行一些美化和調(diào)整,今天,我將向大家介紹一個(gè)使用Python編程語(yǔ)言,結(jié)合PIL(Python Imaging Library)庫(kù),給圖片添加圓角效果的方法,需要的朋友可以參考下
    2025-03-03
  • Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解)

    Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解)

    這篇文章主要介紹了Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01

最新評(píng)論

赞皇县| 神木县| 丹巴县| 石门县| 茌平县| 邹平县| 施秉县| 池州市| 道孚县| 凤凰县| 钦州市| 农安县| 武宣县| 潼南县| 略阳县| 砚山县| 英德市| 旬阳县| 九寨沟县| 遂平县| 监利县| 瑞昌市| 新津县| 郎溪县| 山西省| 虞城县| 怀宁县| 青海省| 东山县| 元朗区| 松原市| 海林市| 南靖县| 土默特右旗| 祥云县| 涞水县| 汕头市| 永定县| 融水| 增城市| 合川市|