日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)

發布時間:2024/9/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(七) 色彩空間

什么是色彩空間,人們建立了多種色彩模型,以一維、二維、三維甚至四維空間坐標來表示某一色彩,這種坐標系統所能定義的色彩范圍即色彩空間

色彩空間有很多,但是常用的色彩空間一共5種:RGB、HSV、HSI、YCrCb、YUV,簡單講一下這5個色彩空間。

RGB就不用多說了,RGB是我門經常用到的;

HSV也稱六角錐體模型,是根據顏色的直觀特性創建的一種顏色空間,這個顏色空間是本節課講解的一個重點。

HSI是從人的視覺系統出發,用色調( Hue )、色飽和 度( Saturation 或 Chroma )和亮度( Intensity 或 Brightness )來描述顏色。 HSI 顏色空間可以用一個圓 錐空間模型來描述

YCrCb主要用于優化彩色視頻信號的傳輸,使其向后相容老式黑白電視,這個可以用來檢測皮膚和檢測人臉

YUV是被歐洲電視系統所采用的一種顏色編碼方法(屬于PAL),是PAL和SECAM模擬彩色電視制式采用的顏色空間。

色彩空間的轉換

OpenCV提供多種將圖像的色彩空間轉換為另一個色彩空間的方法,轉換方法的方法名一般為 “原色彩空間2需要轉化的色彩空間”,下面我們以圖像的RGB色彩轉換為其他四種色彩空間和GRAY色彩空間。

# -*- coding: UTF8 -*-

import cv2 as cv

import numpy as np

def ColorSpace(image):

"""

色彩空間轉化

RGB轉換為其他色彩空間

"""

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

標記圖像中的特定顏色

一般對顏色空間的圖像進行有效處理都是在HSV空間進行的,然后對于基本色中對應的HSV分量需要給定一個嚴格的范圍:

H: 0 — 180

S: 0 — 255

V: 0 — 255

以下是不同顏色的HSV最大最小的范圍:

HSV最大最小的范圍

以下代碼是標注出圖像中的黑色部分,黑色部分將以白色顯示,其他顏色部分將以黑色顯示,顏色標注OpenCV 提供了一個方法,inRange()。該方法提供三個參數,

第一個參數是圖像色彩空間即hsv值,

第二個參數是hsv的最小查找范圍,

第三個參數是hsv的最大查找范圍。代碼運行后,將會標注出圖像的黑色部分。

# -*- 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])

# 第一個參數是圖像色彩空間即hsv值,

# 第二個參數是hsv的最小查找范圍,

# 第三個參數是hsv的最大查找范圍。代碼運行后,將會標注出圖像的黑色部分。

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;

顏色標注

(八)圖像運算

圖像運算也就是像素運算,簡單的說就是利用算術運算或邏輯運算,對圖像的每個像素進行處理(例如兩個圖像的合并)。

注意:我們在處理兩個圖像時,圖像的像素大小和類型要完全一致,否則OpenCV就會報錯。

算術運算

# -*- 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.邏輯運算

def logic(image1,image2):

"""邏輯運算"""

# 與操作

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()

與或非操作

其他算數運算

def others(image1,image2):

#計算每個通道的平均值

m1= cv.mean(image1)

m2 = cv.mean(image2)

#計算每個通道的平均值和方差

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:亮度

"""

#獲取圖片的高、寬和通道數

h,w,ch=image.shape

#創建一個全黑色的圖片

blank=np.zeros([h,w,ch],image.dtype)

#調整亮度和對比度

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

簡單的說就是對圖像感興趣的區域,機器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規則多邊形等方式勾勒出需要處理的區域,稱為感興趣區域,ROI。舉個例子來說:有一副圖片,圖片上有各種動物i,但是你只喜歡圖片里的狗,那么這個狗所在的區域就是感興趣的區域(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像素

# 高度起始位置是從圖片的頂部算起,寬度起始位置是從圖片的左側算起

# 本例中的起始位置和結束位置是通過PhotoShop 測量出來的,在實際應用中這兩個位置是通過算法計算出來的

face = src[85:168, 420:486]

# 效果見圖1,我們取出了原圖的人臉

cv.imshow("取出的圖像".encode("gbk").decode(errors="ignore"), face)

# 將取出的區域改變為灰度圖像

gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)

# 將灰度圖像變為RGB圖像

# 這里改變色彩空間的原因是灰度圖像是單通道的,原圖是三通道的,無法合并

# 所以需要先轉換為三通道的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的油漆桶功能。算法的原理很簡單,就是從一個點開始附近像素點,填充成新的顏色,直到封閉區域內的所有像素點都被填充新顏色為止。泛紅填充實現最常見有四鄰域像素填充法,八鄰域像素填充法,基于掃描線的像素填充方法。根據實現又可以分為遞歸與非遞歸(基于棧)。

import cv2 as cv

import numpy as np

def fill_color(image):

"""

漫水填充:會改變圖像

"""

# 復制圖片

copyImg = image.copy()

# 獲取圖片的高和寬

h, w = image.shape[:2]

# 創建一個h+2,w+2的遮罩層,

# 這里需要注意,OpenCV的默認規定,

# 遮罩層的shape必須是h+2,w+2并且必須是單通道8位,具體原因我也不是很清楚。

mask = np.zeros([h + 2, w + 2], np.uint8)

# 這里執行漫水填充,參數代表:

# copyImg:要填充的圖片

# mask:遮罩層

# (30,30):開始填充的位置(開始的種子點)

# (0,255,255):填充的值,這里填充成黃色

# (100,100,100):開始的種子點與整個圖像的像素值的最大的負差值

# (50,50,50):開始的種子點與整個圖像的像素值的最大的正差值

# cv.FLOODFILL_FIXED_RANGE:處理圖像的方法,一般處理彩色圖象用這個方法

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():

"""

二值填充:不改變圖像,只填充遮罩層本身,忽略新的顏色值參數

"""

# 創建一個400*400的3通道unit8圖片

image = np.zeros([400, 400, 3], np.uint8)

# 將圖片的中間區域變為白色

image[100:300, 100:300, :] = 255

cv.imshow("fill color", image)

mask = np.ones([402, 402, 1], np.uint8)

# 將遮罩層變為黑色

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()

漫水填充

二值填充

總結

以上是生活随笔為你收集整理的python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。