python——opencv:圖像簡單處理

1.灰度變換:
灰度圖像中,R=G=B,常用方法是R=G=B=(R前+G前+B前)/3,即等於灰度變換前RGB的平均值(opencv中的imread方法是以BGR的格式讀入圖像的,但opencv的imshow無需進行反轉)。

import cv2 as cv

image = cv.imread("source_one.jpg")

# 將RGB圖像轉爲灰度圖
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

# cv.imshow("Image", image)
cv.imshow("Gray Image", gray)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述

2.二值變換:
使得灰度圖像中的灰度值爲0(黑)或者255(白),圖像整體呈現黑白顏色。若灰度值爲0,那麼R=G=B=0;若灰度值爲255,那麼R=G=B=255。這裏就需要設定一個閾值,使得小於該閾值的像素位置處的灰度值爲0,大於該閾值的灰度值爲255。

(1)自定義閾值:n個像素點灰度值的平均值。

image = cv.imread("source_one.jpg")

# 將RGB圖像轉爲灰度圖
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

h, w = gray.shape

# 手動計算二值化閾值
threshold = gray.sum() / (h * w)

# 將高於閾值的灰度值賦值255,低於閾值的賦值爲0
ret, binary = cv.threshold(gray, threshold, 255, cv.THRESH_BINARY)

cv.imshow("Binary Image", binary)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述
(2)OTSU大律法,全局自適應閾值,又稱最大類間方差法,最大化前景像素和背景像素之間的方差,使得前景和背景被分錯的概率最小

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)

0可以取任何值,無作用。

(3)triangle三角形法求閾值:
三角形法求閾值

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_TRIANGLE)

在這裏插入圖片描述
(4)二值化反轉,即小於閾值的灰度值爲255,大於閾值的灰度值爲0。

image = cv.imread("source_one.jpg")

# 將RGB圖像轉爲灰度圖
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

h, w = gray.shape

# 手動計算二值化閾值
threshold = gray.sum() / (h * w)

ret, binary = cv.threshold(gray, threshold, 255, cv.THRESH_BINARY_INV)

在這裏插入圖片描述
其餘二值化方法可以參照這篇博客圖像的二值化之python+opencv
3.圖像反色,即RGB分別按位取反,即255減去當前像素值。

img_rev = cv.bitwise_not(image)

在這裏插入圖片描述
4.繪製灰度直方圖:

import cv2 as cv
import matplotlib.pyplot as plt

image = cv.imread("source_one.jpg")

# 將RGB圖像轉爲灰度圖
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
m, n = gray.shape

gray_hist = {}
for k in range(256):
    gray_hist.setdefault(k, 0)
for i in range(m):
    for j in range(n):
        gray_hist[gray[i, j]] += 1

gray_order = list(gray_hist.keys())
gray_num = list(gray_hist.values())
plt.bar(range(256), gray_num, color='c')
plt.title("Gray histogram")
plt.show()

在這裏插入圖片描述
5.形態學腐蝕、膨脹
簡單來說,就是用一個模板對圖像進行掃描,模板的大小決定了腐蝕和膨脹的程度。在腐蝕操作中,用模板的中心點掃描圖像中的每一個像素點,並且模板覆蓋區域的像素值與模板中心點掃描的圖像上的像素點做與運算,只要模板覆蓋區域有一個像素位置處的像素值爲0,則該點像素值就爲0,當模板覆蓋區域所有像素位置處的像素值爲1時,該點處的像素值才爲1,在二值化圖像中,白色區域會被腐蝕掉,由於黑色區域的像素值爲0,0與任何值做與運算結果都是0,所以此時黑色佔主導因素,會腐蝕掉白色區域,只有模板覆蓋的區域完全被白色區域包含時,白色區域才能保留下來。在膨脹操作中,是做或運算,在二值化圖像中,白色區域膨脹,由於白色區域的像素值爲1,在或運算中有一個位置處的像素值爲1,則結果爲1,此時白色區域佔主導因素,白色區域膨脹而黑色區域相對來說就被白色區域腐蝕掉了。

另外,這篇博客對腐蝕和膨脹講的也非常詳細圖像的腐蝕(erode)和膨脹(dilate) 開運算以及閉運算------理論知識及其對應函數
採用3*3模板的腐蝕與膨脹:

kernel = np.ones((3, 3), np.uint8)
# 形態學腐蝕
erosion = cv.erode(binary, kernel)

cv.imshow("Erosion Image", erosion)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述

kernel = np.ones((3, 3), np.uint8)
dilation = cv.dilate(binary, kernel)

#形態學膨脹
cv.imshow("Dilation Image", dilation)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述
6.形態學開操作、閉操作:
這篇博客講解的比較詳細
形態學應用——圖像開運算與閉運算

import cv2 as cv
import numpy as np

image = cv.imread("card.jpg")

# 將RGB圖像轉爲灰度圖
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

# 大律法選擇閾值
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
morph_close = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
morph_open = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)

morph_image = np.hstack((morph_open, morph_close))
cv.imshow("morph_open morph_close", morph_image)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述
左圖爲開運算,右圖爲閉運算。
7.圖像掩膜:
掩膜可以理解爲自定義一個模板,通過該模板掃描圖像以獲取ROI區域:

import cv2 as cv
import numpy as np

image = cv.imread("card.jpg")

mask = np.zeros([517, 690], dtype=np.uint8)
mask[180:410, 48:658] = 255  # ROI區域填充爲白色
image_mask = cv.add(image, np.zeros(np.shape(image), np.uint8), mask=mask)

cv.imshow("Original&Mask", image_mask)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
也可以通過像素之間的與運算來獲取ROI區域:

image_mask = cv.bitwise_and(image, image, mask=mask)

除此之外,還可以通過設置顏色的上下限來創建模板以提取ROI區域:

import cv2 as cv
import numpy as np

image = cv.imread("card.jpg")

lower = np.array([90, 80, 150])
upper = np.array([225, 225, 225])
mask = cv.inRange(image, lower, upper)
image_mask = cv.bitwise_and(image, image, mask=mask)

cv.imshow("Mask", image_mask)
cv.waitKey(0)
cv.destroyAllWindows()

在這裏插入圖片描述
(這裏設置的顏色上下限是基於BGR通道,而不是RGB,因爲imread是以BGR的格式讀取圖像。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章