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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

2 用python进行OpenCV实战之图像基本知识

發(fā)布時(shí)間:2023/11/28 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2 用python进行OpenCV实战之图像基本知识 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在這一節(jié),我們將學(xué)習(xí)圖像的基本構(gòu)成單元——像素,我們將詳細(xì)的探討什么是像素?像素是如何使用來(lái)構(gòu)成圖像的?然后學(xué)習(xí)如何通過(guò)OpenCV來(lái)獲取和操縱像素。

1 什么是像素

所有的圖像都包含一組像素,像素是圖像的原始構(gòu)建塊。 沒(méi)有比像素更細(xì)的單位了。
通常,我們將像素認(rèn)為是在我們的圖像給定位置出現(xiàn)的光的顏色或者強(qiáng)度,如果我們將圖像考慮成一個(gè)網(wǎng)格,在網(wǎng)格中的每個(gè)方塊都包含一個(gè)單一的像素。例如,我們假設(shè)有一個(gè)分辨率是500*300的圖像,這就意味著我們的圖像被分成一個(gè)關(guān)于像素的網(wǎng)格,這個(gè)網(wǎng)格有500個(gè)行,300個(gè)列,綜上可知,總共有500*300=150000個(gè)像素在這張圖片中。
像素主要有兩種表達(dá)形式:灰度模式和彩色模式。在一張灰度圖片中,每個(gè)像素有一個(gè)從0至255{[0,255]}的值,其中0表示“純黑色”,255表示“純白色”,在0和255之間的值變現(xiàn)成不同深淺的灰色,當(dāng)值靠近0時(shí),圖像更暗,當(dāng)值靠近255時(shí),圖像更亮。
彩色模式的圖片通常用RGB顏色空間來(lái)表示(R for red, G for green, B for blue),還有一些其他的模式比如CMY,但是在這里我們先不討論。
我們以(red, green, blue)的形式來(lái)表示RGB元組,這個(gè)元組就表示了我們的顏色,其中這三種顏色的值用在[0,255]之間的整數(shù)值表示,所以我們通常用unsigned int類型來(lái)表示每個(gè)顏色的強(qiáng)度。
為了構(gòu)成白色,我們需要用(255, 255, 255)來(lái)表示,為了得到黑色,我們需要用(0, 0, 0)來(lái)表示,紅(255, 0, 0),綠(0, 255, 0),藍(lán)(0, 0, 255).
RGB配色表

2 圖像坐標(biāo)系概述

正如我們之前所提到的,我們將一張圖片以像素網(wǎng)格的形式表示,我們想象一下假設(shè)我們的圖片為一張圖表紙,圖像的左上角為原點(diǎn)。

3 獲取和操縱像素

上一節(jié)中,我們從磁盤中讀取了圖片,然后將它轉(zhuǎn)換了格式再存儲(chǔ)到了磁盤中,在這一節(jié)我們將對(duì)如何獲取和操縱圖像的像素進(jìn)行實(shí)戰(zhàn),建立

getting_and_setting.py

3.1 代碼

from __future__ import print_function #1
import argparse #2
import cv2 #3ap = argparse.ArgumentParser() #4
ap.add_argument("-i", "--image", required=True,help="Path to the image") #5
args = vars(ap.parse_args()) #6image = cv2.imread(args["image"]) #7
cv2.imshow("Original", image) #8(b, g, r) = image[0, 0] #9
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b)) #10image[0, 0] = (0, 0, 255) #11
(b, g, r) = image[0, 0] #12
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b)) #13corner = image[0:200, 0:100] #14
cv2.imshow("corner1", corner) #15image[0:200, 0:100] = (0, 255, 0) #16
cv2.imshow("update", image) #17
cv2.waitKey(0) #18

3.2 代碼詳細(xì)解釋

#1-6:
關(guān)于這段代碼在第一節(jié)中已經(jīng)進(jìn)行過(guò)詳細(xì)解釋了,主要是為了導(dǎo)包,命令行參數(shù)的處理

#7-8:
展示原始圖片

#9:
在第一節(jié)中,就曾經(jīng)提到過(guò)OpenCV是用NumPy數(shù)組來(lái)表示圖像的,我們也可以將這種表示看成是一種矩陣表示,為了獲取像素,我們需要應(yīng)用我們所感興趣的x,y坐標(biāo),從中我們可以得到一個(gè)表示(r,g,b)的元組,然而,我們需要注意的是:在OpenCV中是以逆序存儲(chǔ)RGB通道到的,即我們通常以red,green,blue的順序來(lái)記憶,但是OpenCV則是以blue,green,red的順序來(lái)儲(chǔ)存的.

(b, g, r) = image[0, 0]

通過(guò)獲得圖像(0,0)處的像素,并將它賦值給一個(gè)三元組,我們可以再次看出OpenCV以逆序存取RGB像素,所以當(dāng)我們?cè)谠M中得到每個(gè)元素時(shí)候,我們需要以BGR的順序來(lái)獲取

#10:
輸出RGB每個(gè)通道的值到終端。可以看出我們獲取像素值的方法非常簡(jiǎn)單,而這一切都要?dú)w功于NumPy,它替我們做了一系列的復(fù)雜工作。

#11:
我們操縱在左上角的像素,即在(0,0)處的像素,我們給他賦值(0,0,255),如果我們將它以RGB的格式來(lái)讀的話,我們認(rèn)為:red值是0,green值是0,blue值是255,所以我們將得到純藍(lán)色。然而,正如我們之前所提到的OpenCV是以BGR的格式存儲(chǔ)像素的而不是RGB格式,所以我們實(shí)際上得到的是:red值是255,green值是0,blue值是0,因此我們得到的是一個(gè)純紅色而不是純藍(lán)色。

#12,13:
通過(guò)得到在(0,0)像素點(diǎn)的BGR顏色值,然后將它們以RGB的形式輸出

#14
獲取以及操縱單一的像素點(diǎn)是相當(dāng)簡(jiǎn)單的,那如果使用NumPy的數(shù)組分割能力得到圖像的一塊長(zhǎng)方形區(qū)域呢?

corner = image[0:200, 0:100] #14

在第一節(jié)我們介紹過(guò)image的數(shù)組里的第一個(gè)參數(shù)是高即y,第二個(gè)參數(shù)是寬即x,所以corner將得到一個(gè)100*200大小的長(zhǎng)方形區(qū)域,而這個(gè)區(qū)域即為圖像的左上角區(qū)域。

#15:
將corner以“Corner”的名稱顯示出來(lái)

#16:
將左上角的區(qū)域用(0,255,0)即綠色來(lái)表示,實(shí)現(xiàn)了改變一整塊區(qū)域的像素值的目的。

#17:
以“Updated”的名稱顯示圖像

#18:
cv2.waitKey()表示暫停腳本的執(zhí)行直到在鍵盤輸入一個(gè)按鍵,用“0”作為參數(shù)表示可以使用任何按鍵作為繼續(xù)腳本執(zhí)行的按鈕。

效果展示


轉(zhuǎn)載請(qǐng)注明出處:
CSDN:樓上小宇__home:http://http://blog.csdn.net/sty945
簡(jiǎn)書(shū):樓上小宇:http://www.jianshu.com/u/1621b29625df

總結(jié)

以上是生活随笔為你收集整理的2 用python进行OpenCV实战之图像基本知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。