日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

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

生活随笔

當(dāng)前位置: 首頁(yè) >

第二章:图像处理基础

發(fā)布時(shí)間:2023/12/9 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第二章:图像处理基础 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第二章:圖像處理基礎(chǔ)操作

  • 一、圖像的基本表示方法:
    • 1. 二值圖像:
    • 2. 灰度圖像:
    • 3. 彩色圖像:
  • 二、像素處理:
    • 1. 二值圖像及灰度圖像:
    • 2.彩色圖像:
    • 3. 使用numpy.array訪問(wèn)像素:
  • 三、感興趣區(qū)域(ROI):
  • 四、通道操作:
    • 1. 通道拆分:
    • 2. 通道合并:
  • 五、獲取圖像屬性:

本章主要介紹:

  • 圖像的基本表示方法
  • 像素的訪問(wèn)和操作
  • 感興趣區(qū)域的處理
  • 通道處理

等知識(shí)點(diǎn)。需要注意的是,使用面向Python的OpenCV必須熟練掌握Numpy庫(kù),尤其是Numpy.array庫(kù),Numpy.array庫(kù)是python處理圖像的基礎(chǔ)。

一、圖像的基本表示方法:

圖像的基本表示方法有:

  • 二值圖像
  • 灰度圖像
  • 彩色圖像

1. 二值圖像:

二值圖像是指僅包含黑色和白色兩種顏色的圖像。

計(jì)算機(jī)中,通過(guò)矩陣來(lái)表示和處理圖像。例如下圖一個(gè)A的圖像,計(jì)算機(jī)在處理該圖像時(shí),會(huì)首先將其劃分為一個(gè)個(gè)的小方塊,即像素點(diǎn),每一個(gè)像素點(diǎn)都是一個(gè)獨(dú)立的處理單元。然后,將其中白色的像素點(diǎn)置為1,黑色的像素點(diǎn)置為0,用于后續(xù)的存儲(chǔ)和處理操作。

2. 灰度圖像:

二值圖像表示起來(lái)簡(jiǎn)單方便,但是因?yàn)槠鋬H有黑白兩種顏色,所表示的圖像不夠細(xì)膩。如果需要表示更多的細(xì)節(jié),就需要使用更多的顏色。

例如,下圖的灰度圖像:

通常,計(jì)算機(jī)會(huì)將灰度處理為256個(gè)灰度級(jí),用區(qū)間[0, 255]來(lái)表示。其中255表示純白色,0表示純黑色,其余的數(shù)值表示從純白色到純黑色之間前不同級(jí)別的灰度。

用于表示256個(gè)灰度級(jí)的數(shù)值0-255,正好可以用一個(gè)字節(jié)(8個(gè)2進(jìn)制位)來(lái)表示。如下圖是部分二進(jìn)制值所對(duì)應(yīng)的十進(jìn)制值:

有些情況下,也會(huì)使用8位二進(jìn)制來(lái)表示一幅二值圖像。這種情況下,255表示白色,0表示黑色,圖像中只存在255和0。

3. 彩色圖像:

? 相比二值圖像和灰度圖像,彩色圖像是更常見(jiàn)的一類(lèi)圖像。神經(jīng)生理學(xué)實(shí)驗(yàn)發(fā)現(xiàn),在視網(wǎng)膜上存在三種不同的顏色感受器,能夠感受三種不同的顏色:紅色、綠色和藍(lán)色,即三基色。自然界中常見(jiàn)的各種色光都可以通過(guò)將三基色按照一定的比例混合構(gòu)成。除此之外,從光學(xué)角度出發(fā),可以將顏色解析為主波長(zhǎng)、純度、明度等。從心理學(xué)和視覺(jué)角度出發(fā),可以將顏色解析為色調(diào)、飽和度、亮度等。通常,我們將上述方式采用不同的方式來(lái)表述顏色的模式稱(chēng)為色彩空間,或者顏色空間、顏色模式。

? 雖然,不同的色彩空間具有不同的表示方式,但是各種色彩空間之間可以根據(jù)相應(yīng)的公式進(jìn)行轉(zhuǎn)換。

? 例如,在RGB色彩空間中,存在R通道、G通道、B通道,共三個(gè)通道。每個(gè)色彩通道值的方位都在[0, 255]之間。因此,通常用一個(gè)三維數(shù)組來(lái)表示一幅RGB色彩空間的彩色圖像。注意,在OpenCV中,通道的順序是B-G-R。

二、像素處理:

像素是圖像構(gòu)成的基本單位,像素處理是圖像處理的基本操作,可以通過(guò)位置索引的形式對(duì)圖像內(nèi)的元素鏡像訪問(wèn)、處理。

1. 二值圖像及灰度圖像:

? 在OpenCV中,最小的數(shù)據(jù)類(lèi)型是無(wú)符號(hào)的8位數(shù)。因此,在OpenCV中實(shí)際是并沒(méi)有二值圖像這種數(shù)據(jù)類(lèi)型,二值圖像經(jīng)常是通過(guò)處理得到的特殊的灰度圖像,使用0表示黑色,使用255表示白色。

? 通過(guò)前面的分析可知,在計(jì)算機(jī)中,圖像就是一個(gè)由像素點(diǎn)組成的矩陣。在面向Python 的OpenCV中,圖像就是Numpy中的數(shù)組。一個(gè)OpenCV灰度圖像就是一個(gè)二維數(shù)組,可以使用表達(dá)式訪問(wèn)其中的像素值。例如:可以使用image[0, 0]訪問(wèn)圖像image第0行第0列未知上的像素點(diǎn)。

示例: 讀取一個(gè)灰度圖像,并對(duì)其像素進(jìn)行訪問(wèn)、修改:

import cv2 img = cv2.imread('lena.bmp', 0) cv2.imshow('before', img) for i in range(10, 100):for j in range(80, 100):img[i, j] = 255 cv2.imshow('after', img) cv2.waitKey() cv2.destroyAllWindows()

2.彩色圖像:

RGB模式的彩色圖像在讀入到OpenCV中進(jìn)行處理時(shí),會(huì)按照行方向依次讀取該RGB圖像的 B通道、G通道、R通道的像素點(diǎn),并將像素點(diǎn)以行為單位存儲(chǔ)在ndarray的列中。例如,有一幅大小為R行×C列的原始RGB圖像,其在OpenCV內(nèi)衣BGR模式的三維數(shù)組形式存儲(chǔ)。

可以使用表達(dá)式訪問(wèn)數(shù)組內(nèi)的值。例如,可以使用image[0, 0, 0] 訪問(wèn)圖像image第0行第0列像素點(diǎn)的B通道。

  • 第1個(gè)索引表示第0行
  • 第2個(gè)索引表示第0列
  • 第3個(gè)索引表示第0個(gè)顏色通道

示例: 讀取一幅彩色圖像,并對(duì)其像素進(jìn)行訪問(wèn)、修改。

import cv2 img = cv2.imread('lena512color.tiff') cv2.imshow('before', img) # 白色 for i in range(0, 50):for j in range(0, 100):for k in range(0, 3):img[i, j, k] = 255 # 灰色 for i in range(50, 100):for j in range(0, 100):img[i, j] = [128, 128, 128] # 黑色 for i in range(100, 150):for j in range(0, 100):img[i, j] = 0 cv2.imshow('after', img) cv2.waitKey() cv2.destroyAllWindows()

3. 使用numpy.array訪問(wèn)像素:

numpy.array提供了item()和itemset()行數(shù)來(lái)訪問(wèn)和修改像素值,而且這兩個(gè)函數(shù)都是經(jīng)過(guò)優(yōu)化處理的,能夠大幅度提高處理效率。在訪問(wèn)和修改像素點(diǎn)的值時(shí),利用numpy.array提供的函數(shù)要比直接使用索引快得多,同時(shí)這兩個(gè)函數(shù)的可讀性也更好。

  • 二值圖像及灰度圖像:
    可以將二值圖像理解為特殊的灰度圖像。

    • item():訪問(wèn)像素點(diǎn),語(yǔ)法:item(行,列)
    • item():修改像素值,語(yǔ)法:itemset(索引值,新值)

    示例: 讀取一幅灰度圖像,并對(duì)其進(jìn)行像素值訪問(wèn)及修改。

    import cv2 img = cv2.imread('../lena.bmp', 0) print('讀取像素點(diǎn)img.item(3, 2)=', img.item(3, 2)) img.itemset((3, 2), 255) print('修改后像素點(diǎn)img.item(3, 2)=', img.item(3, 2)) cv2.imshow('before', img) for i in range(10, 200):for j in range(80, 300):img.itemset((i, j), 255) cv2.imshow('after', img) cv2.waitKey() cv2.destroyAllWindows()

  • 彩色圖像:

  • 同樣可以使用item()函數(shù)和itemset()函數(shù)來(lái)訪問(wèn)和修改彩色圖像的像素值,過(guò)程與操作灰度圖像 相似。不同的是需要補(bǔ)充通道信息。

    • item():訪問(wèn)EGB模式圖像的像素值。語(yǔ)法:item(行,列, 通道)

    • itemset():修改RGB模式圖像像素值。語(yǔ)法:itemset(三元組索引值,新值)

      需要注意,針對(duì)RGB圖像的訪問(wèn),必須同時(shí)指定行、列以及通道,例如img.item(a, b, c)。僅指定行和列是不可以的。

    示例: 讀取已否彩色圖像,并對(duì)其進(jìn)行像素訪問(wèn)、修改

    import cv2 img = cv2.imread('lena512color.tiff') cv2.imshow('before', img) print('訪問(wèn)img.item(0, 0, 0) = ', img.item(0, 0, 0)) # 白色 for i in range(0, 50):for j in range(0, 100):for k in range(0, 3):img.itemset((i, j, k), 255) cv2.imshow('after', img) print('修改后端img.item(0, 0, 0) = ', img.item(0, 0, 0)) cv2.waitKey() cv2.destroyAllWindows()

在這里插入圖片描述

訪問(wèn)img.item(0, 0, 0) = 125
修改后端img.item(0, 0, 0) = 255

三、感興趣區(qū)域(ROI):

在圖像處理過(guò)程中,我們可能會(huì)對(duì)圖像的摸一個(gè)特定區(qū)域感興趣,該區(qū)域被稱(chēng)為感興趣區(qū)域(ROI)。在設(shè)定感興趣區(qū)域ROI后,就可以對(duì)該區(qū)域進(jìn)行整體操作。例如,將一個(gè)感興趣區(qū)域A賦值給變量B后,可以將該變量B賦值給另外一個(gè)區(qū)域C,從而達(dá)到在區(qū)域C內(nèi)復(fù)制區(qū)域A的目的。

示例1: 假設(shè)當(dāng)前圖像名稱(chēng)為img,圖中的數(shù)字分別表示行號(hào)和列號(hào)。那么,圖像中的黑色ROI可以表示為img[200:400, 200:400],

通過(guò)一下語(yǔ)句,能夠?qū)D中黑色ROI復(fù)制到該區(qū)域右側(cè):

a = img[200:400, 200:400]

img[200:400, 600:800] = a

示例2: 獲取圖像lena的臉部信息,并將其顯示出來(lái)。

import cv2 a = cv2.imread('lena512color.tiff', cv2.IMREAD_UNCHANGED) face = a[220: 400, 250: 350] cv2.imshow('original', a) cv2.imshow('face', face) cv2.waitKey() cv2.destroyAllWindows()

示例3: 對(duì)lena圖像臉部進(jìn)行打碼

import cv2 import numpy as np a = cv2.imread('../lena512color.tiff', cv2.IMREAD_UNCHANGED) cv2.imshow('original', a) face = np.random.randint(0, 256, (180, 100, 3)) a[220: 400, 250: 350] = face cv2.imshow('result', a) cv2.waitKey() cv2.destroyAllWindows()

四、通道操作:

在RGB圖像中,圖像由R通道、G通道、B通道三個(gè)通道構(gòu)成的。需要注意的是,在OpenCV中,通道是按照B通道-G通道-R通道的順序存儲(chǔ)的。在圖像處理過(guò)程中,可以根據(jù)需要對(duì)圖像進(jìn)行通道拆分和通道合并。

1. 通道拆分:

針對(duì)RGB圖像,可以分別拆分出其R通道、G通道、B通道。在OpenCV中,即可以通過(guò)索引的方式拆分通道,也可以通過(guò)函數(shù)的方式拆分通道。

  • 通過(guò)索引拆分通道:

    通過(guò)索引的方式,可以直接將各個(gè)通道從圖像內(nèi)提取出來(lái)。如:針對(duì)OpneCV中的BGR圖像img

    • b = img[ : , : , 0]
    • g = img[ : , : , 1]
    • r = img[ : , : , 2]

    示例: 編寫(xiě)程序,演示圖像通道才分及通道值變換對(duì)彩色圖像的影響。

    import cv2 lena = cv2.imread('lena512color.tiff') cv2.imshow('lena1', lena) b = lena[:, :, 0] g = lena[:, :, 1] r = lena[:, :, 2] cv2.imshow('b', b) cv2.imshow('g', g) cv2.imshow('r', r) lena[:, :, 0] = 0 cv2.imshow('lenab0', lena) lena[:, :, 1] = 0 cv2.imshow('lenabogo', lena) cv2.waitKey() cv2.destroyAllWindows()

  • 通過(guò)函數(shù)拆分通道:

    函數(shù)cv2.split()能夠拆分圖像的通道。如,可以使用以下語(yǔ)句拆分彩色BGR圖像img,得到圖像的B,G,R通道。

    • b, g, r = cv2.split(img)

      b = cv2.split(img)[0]

      g = cv2.split(img)[1]

      r = cv2.split(img)[2]

    示例: 使用函數(shù)cv2.split()拆分圖像通道

    import cv2 lena = cv2.imread('../lena512color.tiff') b, g, r = cv2.split(lena) cv2.imshow('B', b) cv2.imshow('G', g) cv2.imshow('R', r) cv2.waitKey() cv2.destroyAllWindows()

2. 通道合并:

通道合并是通道拆分的逆過(guò)程,通過(guò)合并通道可以將三個(gè)通道的灰度圖像構(gòu)成一幅彩色圖像。函數(shù)cv2.merge()可以實(shí)現(xiàn)圖像通道的合并,如有B, G, R三個(gè)通道圖像,使用函數(shù)cv2.merge()將其合并為一幅BGR三通道的彩色圖像。其實(shí)現(xiàn)語(yǔ)句為:bgr_img = cv2.merge([b, g, r])

示例: 使用函數(shù)cv2.merge()合并通道。

import cv2 lena = cv2.imread('../lena512color.tiff') b, g, r = cv2.split(lena) bgr = cv2.merge([b, g, r]) rgb = cv2.merge([r, g, b]) cv2.imshow('lena', lena) cv2.imshow('bar', bgr) cv2.imshow('rgb', rgb) cv2.waitKey() cv2.destroyAllWindows()

五、獲取圖像屬性:

在圖像處理過(guò)程中,經(jīng)常需要獲取圖像的屬性,如圖像的大小、類(lèi)型等。這里介紹幾個(gè)常用的屬性

  • shape:如果是彩色圖像,則返回包含行數(shù)、列數(shù)、通道數(shù)的數(shù)組;如果是二值圖像或者灰度圖像,則僅返回行數(shù)和列數(shù)。通過(guò)該屬性的返回值是否包含通道數(shù),可以判斷圖像是灰度圖像還是彩色圖像。
  • size:返回圖像的像素?cái)?shù)目。其值為"行數(shù)×列數(shù)×通道數(shù)",灰度圖像揮著二值圖像通道數(shù)為1
  • dtype:返回圖像的數(shù)據(jù)類(lèi)型

示例:

import cv2 gray = cv2.imread('../lena.bmp', 0) color = cv2.imread('../lena512color.tiff') print('圖像gray屬性') print('gray.shape=', gray.shape) print('gray.size=', gray.size) print('gray.dtype=', gray.dtype) print('圖像color屬性') print('color.shape=', color.shape) print('color.size=', color.size) print('color.dtype=', color.dtype)
  • 終端輸出:

    圖像gray屬性
    gray.shape= (512, 512)
    gray.size= 262144
    gray.dtype= uint8
    圖像color屬性
    color.shape= (512, 512, 3)
    color.size= 786432
    color.dtype= uint8

該文章內(nèi)容參考總結(jié)自《OpenCV輕松入門(mén)》這本書(shū),詳細(xì)內(nèi)容可以參考這本書(shū)。

總結(jié)

以上是生活随笔為你收集整理的第二章:图像处理基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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