opencv圖片處理常見(jiàn)操作方法總結(jié)
今天學(xué)習(xí)opencv對(duì)圖片的常見(jiàn)處理操作,包括:圖片的打碼,組合,放縮,加法運(yùn)算,加權(quán)運(yùn)算,以及圖片的模糊處理(平滑處理)
1、圖片打碼
代碼:
import cv2 import numpy as np # 圖片打碼 a = cv2.imread(r'img.png') a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩陣賦值必須是相同大小 cv2.imshow( 'masaike',a)
(100,100,3)表示生成100行100列三通道的三維數(shù)組。
運(yùn)行結(jié)果:

2、圖片組合和縮放
代碼:
import cv2
a = cv2.imread('img_1.png')
b = cv2.imread('img.png')
b[20:100,20:100] = a[20:100,20:100]#注意:矩陣的大小必須要統(tǒng)一。
cv2.imshow( 'b',b)
cv2.imshow( 'a',a)
# 圖片縮放cv2.resize
# 用于調(diào)整圖像的大小。它有以下幾個(gè)參數(shù):
# src:要調(diào)整大小的輸入圖像,可以是numpy數(shù)組、PIL圖像或其他類型。
# dsize:輸出圖像的大小,可以是一個(gè)元組,例如(寬,高),或者使用整數(shù)標(biāo)量來(lái)縮放原始圖像。如果dsize為None,則根據(jù)scalex和scaley
# fx:沿x軸的縮放系數(shù)。
# fy:沿y軸的縮放系數(shù)。
a = cv2.imread('img.png')
# a_new = cv2.resize(a,(600,200)) # 寬、高
a_new = cv2.resize(a,dsize=None,fx=1.5,fy=0.5)
cv2.imshow( 'a1',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
運(yùn)行結(jié)果:

3、圖片運(yùn)算
代碼:
import cv2
'''---------圖像運(yùn)算---------'''
# 圖像加法運(yùn)算
# 對(duì)于+號(hào)運(yùn)算,當(dāng)對(duì)圖像a,圖像b進(jìn)行加法求和時(shí),遵循以下規(guī)則:
# 當(dāng)某位置像素相加得到的數(shù)值小于255時(shí),該位置數(shù)值為兩圖像該位置像素相加之和
# 當(dāng)某位置像素相加得到的數(shù)值大于255時(shí),該位置數(shù)值將截?cái)嘟Y(jié)果并將其減去 256 例如:相加后是260,實(shí)際是260-256=4
a = cv2.imread('img.png')
b = cv2.imread('img_1.png')
c = a+10 #圖片
cv2.imshow( 'yuan',a)
cv2.imshow( 'a+10',c)
cv2.waitKey(0)
c = a[50:100,50:100]+b[50:100,50:100]
cv2.imshow( 'a+b',c)
cv2.waitKey(0)
# 對(duì)于cv2.add()運(yùn)算,當(dāng)對(duì)圖像a,圖像b進(jìn)行加法求和時(shí),遵循以下規(guī)則:
# 當(dāng)某位置像素相加得到的數(shù)值小于255時(shí),該位置數(shù)值為兩圖像該位置像素相加之和
# 當(dāng)某位置像素相加得到的數(shù)值大于255時(shí),該位置數(shù)值為255
a = cv2.imread('img.png')
b = cv2.imread('img_1.png')
b = cv2.resize(b, (100,100))
a = cv2.resize(a, dsize= (100,100))
c = cv2.add(a,b) #也可以使用使用
cv2.imshow( 'a add b',c)
cv2.waitKey(0)
# 圖像加權(quán)運(yùn)算
# 就是在計(jì)算兩幅圖像的像素值之和時(shí),將每幅圖像的權(quán)重考慮進(jìn)來(lái),可以用公式表示為dst=src1×α+src2×β+γ
a = cv2.imread('img.png')
b = cv2.imread('img_1.png')
b = cv2.resize(b, dsize= (400,400))
a = cv2.resize(a, dsize= (400,400))
#
c =cv2.addWeighted(a, 0.5,b, 0.5, 10) # 10:圖像的亮度值(常數(shù)),將添加到加權(quán)和上
cv2.imshow( 'addWeighted',c)
cv2.waitKey(0)
cv2.destroyAllWindows()運(yùn)行結(jié)果:

4、平滑處理(模糊處理)
選取一個(gè)像素點(diǎn),一附近的像素點(diǎn)代替,代替方式是使用濾波器,濾波器是一個(gè)卷積核,通過(guò)卷積核實(shí)現(xiàn)均值,中值等運(yùn)算。
代碼:給加入噪聲的圖片進(jìn)行平滑處理消除噪聲,我們看下集中處理方式的用法和效果:
'''---------圖像平滑處理---------'''
# 圖像平滑(smoothing)也稱為"模糊處理"(bluring)
# 通過(guò)消除圖像中的噪聲或細(xì)節(jié)來(lái)使圖像看起來(lái)更為模糊,從而實(shí)現(xiàn)平滑效果
# 可以用來(lái)壓制、弱化、消除圖像中的細(xì)節(jié)、突變和噪聲。
# 下面是常用的一些濾波器
# 均值濾波 -> blur函數(shù)
# 方框?yàn)V波 -> boxFilter函數(shù)
# 高斯濾波->GaussianBlur函數(shù)
# 中值濾波->medianBlur函數(shù)
# dst=cv2.blur(src,ksize,anchor,borderType)
# dst是返回值
# src是需要處理的圖像
# ksize是濾波核(卷積核)的大小
# anchor是錨點(diǎn),默認(rèn)值是(-1,-1)一般無(wú)需更改
# borderType是邊界樣式,一般無(wú)需更改
# 一般情況下,使用dst=cv2.blur(src,ksize)即可
import cv2
import numpy as np
# 1個(gè)用法
def add_peppersalt_noise(image, n=10000):
result = image.copy()
h, w = image.shape[:2] # 獲取圖片的高和寬
for i in range(n): # 生成n個(gè)椒鹽噪聲
x = np.random.randint(0, h)
y = np.random.randint(0, w)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x,y] = 255
return result
# ##
image = cv2.imread('img.png')
cv2.imshow('yuan',image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)
# ## 1、均值濾波 blur
blur_1 = cv2.blur(noise, (3,3)) #卷積核為3,3 效果一般,清晰度一般
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)
blur_2 = cv2.blur(noise, (63,63))
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
#### dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)式中:
#### dst是返回值,表示進(jìn)行方框?yàn)V波后得到的處理結(jié)果。
#### src 是需要處理的圖像,即原始圖像。
#### ddepth是處理結(jié)果圖像的圖像深度,一般使用-1表示與原始圖像使用相同的圖像深度。(可以理解為數(shù)據(jù)類型)
#### ksize 是濾波核的大小。濾波核大小是指在濾波處理過(guò)程中所選擇的鄰域圖像的高 度和寬度。
#### anchor 是錨點(diǎn),(指對(duì)應(yīng)哪個(gè)區(qū)域)
#### normalize 表示在濾波時(shí)是否進(jìn)行歸一化。
#### 1.當(dāng)值為True時(shí),歸一化,用鄰域像素值的和除以面積。 此時(shí)方框?yàn)V波與 均值濾波 效果相同。
#### 2.當(dāng)值為False時(shí),不歸一化,直接使用鄰域像素值的和。和>255時(shí)使用255
boxFilter_1 = cv2.boxFilter(noise,-1, ksize=(3,3),normalize = True) # 2、方框?yàn)V波
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1, ksize=(3,3),normalize = False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)
#### cv2.GaussianBlur(src, ksize[, sigmaX[, sigmaY[, dst]]])高斯濾波
#### 參數(shù)說(shuō)明:
#### src:輸入圖像,通常是一個(gè)NumPy數(shù)組。
#### ksize:濾波器的大小,它是一個(gè)元組,表示在水平和垂直方向上的像素?cái)?shù)量。例如,(5, 5)表示一個(gè)5x5的濾波器。
#### sigmaX和sigmaY:分別表示在X軸和Y軸方向上的標(biāo)準(zhǔn)差。這些值與濾波器大小相同。默認(rèn)情況下,它們都等于0,這意味著沒(méi)有高斯模糊。
#### dst:輸出圖像,通常是一個(gè)NumPy數(shù)組。如果為None,則會(huì)創(chuàng)建一個(gè)新的數(shù)組來(lái)存儲(chǔ)結(jié)果。
GaussianB = cv2.GaussianBlur(noise, ksize=(3,3), sigmaX=1) #標(biāo)準(zhǔn)差為1,標(biāo)準(zhǔn)正太分布。 3、高斯濾波
cv2.imshow('GaussianBlur',GaussianB)
cv2.waitKey(0)
# cv2.medianBlur(src, ksize[, dst]])中值濾波
# 參數(shù)說(shuō)明:
# src:輸入圖像。
# ksize:濾波器的大小,它是一個(gè)整數(shù),表示在水平和垂直方向上的像素?cái)?shù)量。例如,5表示一個(gè)5x5的濾波器。
# dst:輸出圖像,通常是一個(gè)NumPy數(shù)組。如果為None,則會(huì)創(chuàng)建一個(gè)新的數(shù)組來(lái)存儲(chǔ)結(jié)果。
medianB = cv2.medianBlur(noise, ksize=3) # 4、中值濾波
cv2.imshow('medianBlur',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()運(yùn)行結(jié)果:

以上就是今天給大家分享的圖片處理核心知識(shí)點(diǎn):圖片在計(jì)算機(jī)中本質(zhì)是以數(shù)組形式存儲(chǔ)的,其中彩色圖片對(duì)應(yīng) RGB 三通道的數(shù)組結(jié)構(gòu),灰度圖則是單通道數(shù)組。所以我們用 OpenCV 處理圖片,本質(zhì)上就是對(duì)這些數(shù)組進(jìn)行各類運(yùn)算和操作。
總結(jié)
到此這篇關(guān)于opencv圖片處理常見(jiàn)操作方法的文章就介紹到這了,更多相關(guān)opencv圖片處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
tensorflow使用tf.data.Dataset 處理大型數(shù)據(jù)集問(wèn)題
這篇文章主要介紹了tensorflow使用tf.data.Dataset 處理大型數(shù)據(jù)集問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃進(jìn)階基于字典詳解
在大規(guī)模的規(guī)劃問(wèn)題中,這樣逐個(gè)定義變量和設(shè)置模型參數(shù)非常繁瑣,效率很低。Pulp 庫(kù)提供了一種快捷方式,可以結(jié)合 Python語(yǔ)言的循環(huán)和容器,使用字典來(lái)創(chuàng)建問(wèn)題2021-10-10
Python編程使用matplotlib挑鉆石seaborn畫圖入門教程
這篇文章主要為大家介紹了Python編程中使用matplotlib繪圖包來(lái)挑出完美的鉆石,本篇是seaborn包畫圖使用入門篇,有需要的朋友可以借鑒參考下2021-10-10
關(guān)于numpy中矩陣的翻轉(zhuǎn)(flip)
這篇文章主要介紹了關(guān)于numpy中矩陣的翻轉(zhuǎn)(flip),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Django模板標(biāo)簽{% for %}循環(huán),獲取制定條數(shù)據(jù)實(shí)例
這篇文章主要介紹了Django模板標(biāo)簽{% for %}循環(huán),獲取制定條數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05

