python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)
(七) 色彩空間
什么是色彩空間,人們建立了多種色彩模型,以一維、二維、三維甚至四維空間坐標(biāo)來表示某一色彩,這種坐標(biāo)系統(tǒng)所能定義的色彩范圍即色彩空間
色彩空間有很多,但是常用的色彩空間一共5種:RGB、HSV、HSI、YCrCb、YUV,簡單講一下這5個(gè)色彩空間。
RGB就不用多說了,RGB是我門經(jīng)常用到的;
HSV也稱六角錐體模型,是根據(jù)顏色的直觀特性創(chuàng)建的一種顏色空間,這個(gè)顏色空間是本節(jié)課講解的一個(gè)重點(diǎn)。
HSI是從人的視覺系統(tǒng)出發(fā),用色調(diào)( Hue )、色飽和 度( Saturation 或 Chroma )和亮度( Intensity 或 Brightness )來描述顏色。 HSI 顏色空間可以用一個(gè)圓 錐空間模型來描述
YCrCb主要用于優(yōu)化彩色視頻信號(hào)的傳輸,使其向后相容老式黑白電視,這個(gè)可以用來檢測皮膚和檢測人臉
YUV是被歐洲電視系統(tǒng)所采用的一種顏色編碼方法(屬于PAL),是PAL和SECAM模擬彩色電視制式采用的顏色空間。
色彩空間的轉(zhuǎn)換
OpenCV提供多種將圖像的色彩空間轉(zhuǎn)換為另一個(gè)色彩空間的方法,轉(zhuǎn)換方法的方法名一般為 “原色彩空間2需要轉(zhuǎn)化的色彩空間”,下面我們以圖像的RGB色彩轉(zhuǎn)換為其他四種色彩空間和GRAY色彩空間。
# -*- coding: UTF8 -*-
import cv2 as cv
import numpy as np
def ColorSpace(image):
"""
色彩空間轉(zhuǎn)化
RGB轉(zhuǎn)換為其他色彩空間
"""
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray)
hsv=cv.cvtColor(image,cv.COLOR_RGB2HSV)
cv.imshow("hsv",hsv)
yuv=cv.cvtColor(image,cv.COLOR_RGB2YUV)
cv.imshow("yuv",yuv)
ycrcb=cv.cvtColor(image,cv.COLOR_RGB2YCrCb)
cv.imshow("ycrcb",ycrcb)
# 讀入圖片文件
src = cv.imread('images//test.jpg')
ColorSpace(src)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
image.png
標(biāo)記圖像中的特定顏色
一般對顏色空間的圖像進(jìn)行有效處理都是在HSV空間進(jìn)行的,然后對于基本色中對應(yīng)的HSV分量需要給定一個(gè)嚴(yán)格的范圍:
H: 0 — 180
S: 0 — 255
V: 0 — 255
以下是不同顏色的HSV最大最小的范圍:
HSV最大最小的范圍
以下代碼是標(biāo)注出圖像中的黑色部分,黑色部分將以白色顯示,其他顏色部分將以黑色顯示,顏色標(biāo)注OpenCV 提供了一個(gè)方法,inRange()。該方法提供三個(gè)參數(shù),
第一個(gè)參數(shù)是圖像色彩空間即hsv值,
第二個(gè)參數(shù)是hsv的最小查找范圍,
第三個(gè)參數(shù)是hsv的最大查找范圍。代碼運(yùn)行后,將會(huì)標(biāo)注出圖像的黑色部分。
# -*- coding: UTF8 -*-
import cv2 as cv
import numpy as np
capture = cv.VideoCapture("video/test.mp4")
while (True):
ret, frame = capture.read()
if ret == False:
break;
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
lower_hsv = np.array([0, 0, 0])
upperb_hsv = np.array([180, 255, 46])
# 第一個(gè)參數(shù)是圖像色彩空間即hsv值,
# 第二個(gè)參數(shù)是hsv的最小查找范圍,
# 第三個(gè)參數(shù)是hsv的最大查找范圍。代碼運(yùn)行后,將會(huì)標(biāo)注出圖像的黑色部分。
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upperb_hsv)
cv.imshow("video_mask", mask)
cv.imshow("video", frame)
c = cv.waitKey(40)
if c == 27:
break;
顏色標(biāo)注
(八)圖像運(yùn)算
圖像運(yùn)算也就是像素運(yùn)算,簡單的說就是利用算術(shù)運(yùn)算或邏輯運(yùn)算,對圖像的每個(gè)像素進(jìn)行處理(例如兩個(gè)圖像的合并)。
注意:我們在處理兩個(gè)圖像時(shí),圖像的像素大小和類型要完全一致,否則OpenCV就會(huì)報(bào)錯(cuò)。
算術(shù)運(yùn)算
# -*- coding: UTF8 -*-
import cv2 as cv
import numpy as np
def add(image1, image2):
"""圖片相加"""
dst = cv.add(image1, image2)
cv.imshow("add image", dst)
def subtract(image1, image2):
"""圖片相減"""
dst = cv.subtract(image1, image2)
cv.imshow("subtract image", dst)
def divide(image1, image2):
"""圖片相除"""
dst = cv.divide(image1, image2)
cv.imshow("divide image", dst)
def multiply(image1, image2):
"""圖片相乘"""
dst = cv.multiply(image1, image2)
cv.imshow("multiply image", dst)
image1=cv.imread('images//chang1.jpg')
image2=cv.imread('images//chang2.jpg')
add(image1,image2)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
原圖1
原圖2
圖片相加
圖片相減
圖片相乘
2.邏輯運(yùn)算
def logic(image1,image2):
"""邏輯運(yùn)算"""
# 與操作
dst=cv.bitwise_and(image1,image2)
cv.imshow("logic",dst)
# 或操作(與相加操作類似)
dst = cv.bitwise_or(image1, image2)
cv.imshow("logic", dst)
# 非操作(像素取反)
dst = cv.bitwise_not(image1)
cv.imshow("logic", dst)
image1=cv.imread('images//chang1.jpg')
image2=cv.imread('images//chang2.jpg')
logic(image1,image2)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
與或非操作
其他算數(shù)運(yùn)算
def others(image1,image2):
#計(jì)算每個(gè)通道的平均值
m1= cv.mean(image1)
m2 = cv.mean(image2)
#計(jì)算每個(gè)通道的平均值和方差
m1,dev1=cv.meanStdDev(image1)
m2,dev2=cv.meanStdDev(image2)
print(m1,dev1)
print(m2,dev2)
image1=cv.imread('images//chang1.jpg')
image2=cv.imread('images//chang2.jpg')
others(image1,image2)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
平均值和方差
修改亮度和對比度:
def contrast_brightness(image,c,b):
"""
修改亮度和對比度
c:對比度
b:亮度
"""
#獲取圖片的高、寬和通道數(shù)
h,w,ch=image.shape
#創(chuàng)建一個(gè)全黑色的圖片
blank=np.zeros([h,w,ch],image.dtype)
#調(diào)整亮度和對比度
dst=cv.addWeighted(image,c,blank,1-c,b)
cv.imshow("con-bri", dst)
image2=cv.imread('images//chang2.jpg')
contrast_brightness(image2,5,5)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
(九)ROI
簡單的說就是對圖像感興趣的區(qū)域,機(jī)器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域,稱為感興趣區(qū)域,ROI。舉個(gè)例子來說:有一副圖片,圖片上有各種動(dòng)物i,但是你只喜歡圖片里的狗,那么這個(gè)狗所在的區(qū)域就是感興趣的區(qū)域(ROI)。
# -*- coding: UTF8 -*-
import cv2 as cv
import numpy as np
src= cv.imread('images/test.jpg')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
# 高度從42像素開始到282像素
# 寬度從184像素開始到355像素
# 高度起始位置是從圖片的頂部算起,寬度起始位置是從圖片的左側(cè)算起
# 本例中的起始位置和結(jié)束位置是通過PhotoShop 測量出來的,在實(shí)際應(yīng)用中這兩個(gè)位置是通過算法計(jì)算出來的
face = src[85:168, 420:486]
# 效果見圖1,我們?nèi)〕隽嗽瓐D的人臉
cv.imshow("取出的圖像".encode("gbk").decode(errors="ignore"), face)
# 將取出的區(qū)域改變?yōu)榛叶葓D像
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)
# 將灰度圖像變?yōu)镽GB圖像
# 這里改變色彩空間的原因是灰度圖像是單通道的,原圖是三通道的,無法合并
# 所以需要先轉(zhuǎn)換為三通道的RGB色彩空間
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)
# 將取出并處理完的圖像和原圖合并起來
src[85:168, 420:486] = backface
# 效果見圖2
cv.imshow("合并后的圖像".encode("gbk").decode(errors="ignore"), src)
cv.waitKey(0)
cv.destroyAllWindows()
image.png
(十)洪填充
泛洪填充算法又稱洪水填充算法是在很多圖形繪制軟件中常用的填充算法,最熟悉不過就是windows paint的油漆桶功能。算法的原理很簡單,就是從一個(gè)點(diǎn)開始附近像素點(diǎn),填充成新的顏色,直到封閉區(qū)域內(nèi)的所有像素點(diǎn)都被填充新顏色為止。泛紅填充實(shí)現(xiàn)最常見有四鄰域像素填充法,八鄰域像素填充法,基于掃描線的像素填充方法。根據(jù)實(shí)現(xiàn)又可以分為遞歸與非遞歸(基于棧)。
import cv2 as cv
import numpy as np
def fill_color(image):
"""
漫水填充:會(huì)改變圖像
"""
# 復(fù)制圖片
copyImg = image.copy()
# 獲取圖片的高和寬
h, w = image.shape[:2]
# 創(chuàng)建一個(gè)h+2,w+2的遮罩層,
# 這里需要注意,OpenCV的默認(rèn)規(guī)定,
# 遮罩層的shape必須是h+2,w+2并且必須是單通道8位,具體原因我也不是很清楚。
mask = np.zeros([h + 2, w + 2], np.uint8)
# 這里執(zhí)行漫水填充,參數(shù)代表:
# copyImg:要填充的圖片
# mask:遮罩層
# (30,30):開始填充的位置(開始的種子點(diǎn))
# (0,255,255):填充的值,這里填充成黃色
# (100,100,100):開始的種子點(diǎn)與整個(gè)圖像的像素值的最大的負(fù)差值
# (50,50,50):開始的種子點(diǎn)與整個(gè)圖像的像素值的最大的正差值
# cv.FLOODFILL_FIXED_RANGE:處理圖像的方法,一般處理彩色圖象用這個(gè)方法
cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill color", copyImg)
def fill_binary():
"""
二值填充:不改變圖像,只填充遮罩層本身,忽略新的顏色值參數(shù)
"""
# 創(chuàng)建一個(gè)400*400的3通道unit8圖片
image = np.zeros([400, 400, 3], np.uint8)
# 將圖片的中間區(qū)域變?yōu)榘咨?/p>
image[100:300, 100:300, :] = 255
cv.imshow("fill color", image)
mask = np.ones([402, 402, 1], np.uint8)
# 將遮罩層變?yōu)楹谏?/p>
mask[101:301, 101:301] = 0
# 在圖像的中間填充,顏色為紅色,用FLOODFILL_MASK_ONLY方法填充
cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
cv.imshow("filled", image)
src= cv.imread('images/test.jpg')
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()
漫水填充
二值填充
總結(jié)
以上是生活随笔為你收集整理的python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 最少使用(lru)置换算法_缓
- 下一篇: python 量化交易_Quantsra