天天看點

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

安裝

pip install opencv-python      

CV2實踐所用到的圖檔

bug.png

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

1、簡單讀寫

import cv2

# 讀入圖像
img = cv2.imread("source/bug.png")

# 顯示圖像
cv2.imshow("bug", img)
cv2.waitKey(0)  # 機關毫秒
cv2.destroyWindow("bug")

# 複制圖像
new_img = img.copy()

# 儲存圖像
cv2.imwrite("bug-new.png", new_img)
          

顯示如下:

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

2、圖檔翻轉

im = cv2.imread("source/bug.png")
new_img = cv2.flip(im, flipCode=0)
cv2.imwrite("source/bug-flip-0.png", new_img)      

Vertical垂直翻轉(沿X軸)flipCode=0

原圖:

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

翻轉圖:

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

Horizontal水準翻轉(沿Y軸)flipCode=1

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示
Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

horizontal and vertical 水準和垂直翻轉(沿中心點)flipCode=-1

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示
Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

3、色彩變換

彩色圖像轉為灰階圖像?

im = cv2.imread("source/bug.png")
new_img = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
cv2.imwrite("source/bug-gray.png", new_img)      

cv2.COLOR_X2Y

其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

4、給圖檔加文本

  1. 加英文字元
img = cv2.imread("source/bug.png", cv2.IMREAD_COLOR)

# 圖檔對象、文本、像素、字型、字型大小、顔色、字型粗細
new_img = cv2.putText(
    img=img,
    text="OOXX",
    org=(60, 50),
    fontFace=cv2.FONT_HERSHEY_SIMPLEX,
    fontScale=1,
    color=(255, 0, 0),
    thickness=2
)
cv2.imwrite("source/bug-text.png", new_img)
      
Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示
  1. 添加中文字元
opencv

自帶的putText函數無法輸出中文字元,需要借助Pillow

pip install pillow numpy      

代碼示例

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

# 1、将cv2轉為PIL
img = cv2.imread("source/bug.png")
# cv2和PIL中顔色的hex碼的儲存順序不同
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(img)

# 2、PIL圖檔上列印中文
draw = ImageDraw.Draw(pil_img)
font = ImageFont.truetype(font="華文黑體.ttf", size=20, encoding="utf-8")
draw.text(xy=(50, 20), text="愛我中華", fill=(0, 0, 255), font=font)

# 3、PIL圖檔轉cv2
new_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
cv2.imwrite("source/bug-text.png", new_img)
      

Mac本字型路徑,選一個已有的字型

1、/System/Library/Fonts

2、/Library/Fonts

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

參考:

opencv3.2将中文輸出到圖檔上

5、繪圖

import numpy as np
import cv2

# 常用顔色值
RED = (0, 0, 255)
GREEN = (0, 255, 0)
BLUE = (255, 0, 0)

np.set_printoptions(threshold='nan')

# 建立一個寬512高512的黑色畫布,RGB(0,0,0)即黑色
img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)

# 畫直線,圖檔對象,起始坐标(x軸,y軸),結束坐标,顔色,寬度
cv2.line(
    img=img,
    pt1=(0, 0),
    pt2=(311, 511),
    color=BLUE,
    thickness=10
)

# 畫矩形,圖檔對象,左上角坐标,右下角坐标,顔色,寬度
cv2.rectangle(
    img=img,
    pt1=(30, 166),
    pt2=(130, 266),
    color=GREEN,
    thickness=3
)

# 畫圓形,圖檔對象,中心點坐标,半徑大小,顔色,寬度
cv2.circle(
    img=img,
    center=(222, 222),
    radius=50,
    color=(255.111, 111),
    thickness=-1
)

# 畫橢圓形,圖檔對象,中心點坐标,長短軸,順時針旋轉度數,開始角度(右長軸表0度,上短軸表270度),顔色,寬度
cv2.ellipse(
    img=img,
    center=(333, 333),
    axes=(50, 20),
    angle=0,
    startAngle=0,
    endAngle=150,
    color=RED,
    thickness=-1
)

# 畫多邊形,指定各個點坐标,array必須是int32類型
pts = np.array(
    [[10, 5], [20, 30], [70, 20], [50, 10]],
    dtype=np.int32
)

# -1表示該緯度靠後面的緯度自動計算出來,實際上是4
pts = pts.reshape((-1, 1, 2,))
# print(pts)

# 畫多條線,False表不閉合,True表示閉合,閉合即多邊形
cv2.polylines(
    img=img,
    pts=[pts],
    isClosed=True,
    color=(255, 255, 0),
    thickness=5
)


# 添加文字 圖檔對象,要寫的内容,左邊距,字的底部到畫布上端的距離,字型,大小,顔色,粗細
cv2.putText(
    img=img,
    text="OpenCV",
    org=(10, 400),
    fontFace=cv2.FONT_HERSHEY_SCRIPT_COMPLEX,
    fontScale=3.5,
    color=(255, 255, 255),
    thickness=2
)

cv2.imwrite("picture.jpg", img)
      
Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

6、圖像的表示

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示

圖A

來自:

https://www.cnblogs.com/shizhengwen/p/8719062.html

3維數組

單通道的灰階圖像在計算機中的表示:一個8位無符号整形的矩陣

多通道表示 : 第一個次元是高度,第二個次元是高度,第三個次元是通道

表達方式: 高度×寬度×通道數,H×W×C

深度學習: C×H×W (就是把每個通道都單獨表達成一個二維矩陣, 如圖A-c)

OpenCV預設圖像表示:BGR

////

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 矩陣
img = np.array([
    [[255, 0, 0], [0, 255, 0], [0, 0, 255]],
    [[255, 255, 0], [255, 0, 255], [0, 255, 255]],
    [[255, 255, 255], [128, 128, 128], [0, 0, 0]],
], dtype=np.uint8)

# 用matplotlib存儲
plt.imsave('img_pyplot.jpg', img)

# 用OpenCV存儲
cv2.imwrite('img_cv2.jpg', img)      

左邊:img_pyplot.jpg

右邊:img_cv2.jpg

Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示
Python程式設計:cv2子產品對圖像處理的基本操作1、簡單讀寫2、圖檔翻轉3、色彩變換4、給圖檔加文本5、繪圖6、圖像的表示
子產品cv2的用法

繼續閱讀