openCV入門 核心操作 1 影像的基礎操作

@bwang發表於2020-10-03

基礎函式

img[100, 100] = [255, 255, 255]
#img[100,100]是影像座標,[255,255,255]是畫素值
img[100, 100, 0]
#b:0,g:1,r:2
img.item(10, 10, 2)
#獲取r(分割r,g,b)
img.itemset((10, 10, 2), 100)
#修改畫素值(修改r,b,g)
img.shape
#輸出影像  行數、列數、通道數的元組
img.size
#返回影像的畫素數目 = 行數*列數*通道數
img.dtype
#返回影像的資料型別 (uint8)

ball = img[280:340, 330:390]
img[273:333, 100:160] = ball
#把影像的特定區域拷貝到影像的其他區域

b,g,r = cv2.split(img)
#b = img[:,:,0]
#拆分
img = cv2.merge(b,g,r)
#合併
img[:,:,2] = 0

cv2.copyMakeBorder()
#ret = cv2.copyMakeBorder(img, row, row, col, col, cv2.BORDER_CONSTANT)
#輸入影像,相應方向(上下左右)的邊框寬度,填充的值的方式
#cv2.BORDER_CONSTANT:新增的邊界框畫素值為常數(需要額外再給定一個引數)
#cv2.BORDER_REFLECT:新增的邊框畫素將是邊界元素的鏡面反射,類似於gfedcb|abcdefgh|gfedcba
#cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT:和上面類似,但是有一些細微的不同,類似於gfedcb|abcdefgh|gfedcba
#cv2.BORDER_REPLICATE:使用最邊界的畫素值代替
plt.subplot()
#連續繪製多個圖
#plt.subplot( numRows, numCols,  plotNum)
# 整個Figure會被劃分為numRows行,numCols列,並從左往右,從上往下編號為1,2…。也就是說plotNum指定了子圖所在的位置。
# 此外,如果三個引數的都小於10,則可以簡寫在一起,例如:subplot(4,3,2)也可以寫成subplot(432)
# 例如:plt.subplot(222)表示將整個影像視窗分為2行2列, 當前位置為2.
plt.imshow()
#顯示圖片,同時也顯示其格式。
plt.title()
#plt.title(‘Interesting Graph’,fontsize=‘large’,fontweight=‘bold’) 設定字型大小與格式
#plt.title(‘Interesting Graph’,color=‘blue’) 設定字型顏色
#plt.title(‘Interesting Graph’,loc =‘left’) 設定字型位置
#plt.title(‘Interesting Graph’,verticalalignment=‘bottom’) 設定垂直對齊方式
#plt.title(‘Interesting Graph’,rotation=45) 設定字型旋轉角度
#plt.title(‘Interesting’,bbox=dict(facecolor=‘g’, edgecolor=‘blue’, alpha=0.65 )) 標題邊框

獲取並修改畫素值

import cv2
import numpy as np
img = cv2.imread ('imag.jpg')
print (img.item(10,10,2))
#第十行,第十列的r值,,,(b,g,r)
img.itemset((10,10,2),100)
#或img[:,:,2] = 100
#用100代替r,成為新的r值
print (img.item(10,10,2))

獲取影像屬性

import cv2
import numpy as np
img = cv2.imread ('imag.jpg')
print img.shape
#輸出影像  行數、列數、通道數的元組
print img.size
#返回影像的畫素數目 = 行數*列數*通道數
print img。dtype
#返回影像的資料型別 (uint8)

影像RoI

import cv2
import numpy as np
img = cv2.imread ('imag.jpg')
ball=img[280:340,330:390] 
img[273:333,100:160]=bal
#把影像的特定區域拷貝到影像的其他區域

拆分及合併影像通道

import cv2
import numpy as np
img = cv2.imread ('imag.jpg')
b,g,r=cv2.split(img)
#拆分    或b=img[:,:,0]
img=cv2.merge(b,g,r)
#合併
#或img[:,:,2]=0

為影像擴邊(填充)

import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE=[255,0,0]

img1=cv2.imread('sz.jpg')

replicate = cv2.copyMakeBorder(img1,50,50,50,50,cv2.BORDER_REPLICATE)
#cv2.BORDER_REPLICATE:使用最邊界的畫素值代替
reflect = cv2.copyMakeBorder(img1,50,50,50,50,cv2.BORDER_REFLECT)
#cv2.BORDER_REFLECT:新增的邊框畫素將是邊界元素的鏡面反射,類似於gfedcb|abcdefgh|gfedcba
reflect101 = cv2.copyMakeBorder(img1,50,50,50,50,cv2.BORDER_REFLECT_101)
#cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT:和上面類似,但是有一些細微的不同,類似於gfedcb|abcdefgh|gfedcba
wrap = cv2.copyMakeBorder(img1,50,50,50,50,cv2.BORDER_WRAP)
constant=cv2.copyMakeBorder(img1,50,50,50,50,cv2.BORDER_CONSTANT,value=BLUE)
#cv2.BORDER_CONSTANT:新增的邊界框畫素值為常數(需要額外再給定一個引數)

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
# 例如:plt.subplot(232)表示將整個影像視窗分為2行3列, 當前位置為2
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
#plt.imshow(replicate,'gray') = cv2.imshow('gray',replicate)
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
#plt.title()   圖注
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

效果
在這裡插入圖片描述

相關文章