【opencv系列07】OpenCV4.X图像基本操作
點擊上方“AI搞事情”關注我們
一、像素操作
可以通過行列坐標訪問像素值,對于BGR圖,返回一個藍色、綠色、紅色通道的數組值,對于灰度圖,僅返回相應的強度值。
代碼
import cv2 img = cv2.imread('image.jpg') px = img[32,32] # 訪問(32,32)坐標像素值 print(px) print(img[32,32,0]) # 訪問B通道像素值 print(img[32,32,1]) # 訪問G通道像素值 img[32,32] = [108, 108, 108] # 修改像素值 print(img[32,32])輸出
[ 93 136 145] 93 136 [108 108 108]Note:
Numpy是一個用于快速陣列計算的優化庫。因此,簡單地訪問每個像素值并對其進行修改將非常緩慢。
上述方法通常用于選擇數組的一個區域,比如前五行和三列,對于訪問單個像素點,推薦使用array.item()和array.itemset(),它們返回的是一個標量。如果需要訪問所有B,G,R值,需要對它們單獨調用array.item()。
代碼
import cv2 img = cv2.imread('image.jpg') p = img.item(32,32,2) # 訪問R值 print(p) img.itemset((32,32,2),100) # 修改R值 p = img.item(32,32,2) print(p)輸出
145 100二、圖像屬性
圖像屬性包括:行、列、通道數,數據類型,像素數目。
import cv2 img = cv2.imread('image.jpg')print(img.shape) #圖像的形狀,返回值是一個包含行數(高)、列數(寬)、通道數的元組。 print(img.size) #圖像的像素數目。 print(img.dtype) #圖像的數據類型。輸出
(640, 1024, 3) 1966080 uint8Note:
注意如果圖像是灰度圖像,img.shape返回的元組僅包含行數和列數,因此它是一種檢查圖像是灰度圖像還是彩色圖像的好方法。
img.dtype在調試時非常重要,因為OpenCV-Python代碼中的大量錯誤是由無效的數據類型引起的。
三、圖像ROI
ROI (region of interest, 感興趣區域)是從圖像中選擇的一個圖像區域,這個區域是你的圖像分析所關注的重點。圈定該區域以便進行進一步處理。使用ROI圈定你想處理的目標,可以減少處理時間,增加精度。比如:對于圖像中的眼睛檢測,在整個圖像上進行第一次面部檢測。當獲得面部時,我們單獨選擇面部區域并在其內部搜索眼睛而不是搜索整個圖像。
選擇圖像ROI并將其復制到圖像中的另一個區域
代碼
import cv2 img = cv2.imread('image.jpg')husky = img[1:240,60:270] img[61:300,270:480] = huskycv2.imshow('show',img) cv2.waitKey()四、通道拆分
B,G,R三通道含有不同的顏色信息,有時需要將通道分離,在單個通道進行操作。有兩種通道分離的方式:
cv2.split函數
numpy切片
單通道所有像素置零
img[:,:,2] = 0NOTE:
cv2.split()相對比較耗時,必要時才使用。否則建議使用Numpy索引。
五、圖像邊框
copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)
src:輸入圖像
top,bottom,left,right:相應方向上像素數的邊框寬度
value :
cv2.BORDER_CONSTANT
cv2.BORDER_REFLECT
cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT
cv2.BORDER_REPLICATE
cv2.BORDER_WRAP
不同value效果代碼
import cv2 from matplotlib import pyplot as pltBLUE = [255,0,0]img1 = cv2.imread('image.jpg')replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP) constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') 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()六、應用
1. 獲取圖像ROI并拼接在原圖下方
代碼
import cv2 import numpy as npimg1 = cv2.imread('image.jpg') img2 = img1[200: 500, 300:650, :]w = max(img1.shape[1], img2.shape[1]) h = img1.shape[0] + img2.shape[0]merge_img = np.zeros((h, w, 3), dtype=np.uint8) merge_img[:img1.shape[0], :img1.shape[1]] = img1 merge_img[img1.shape[0]:, :img2.shape[1]] = img2 cv2.imwrite('res.jpg', merge_img) cv2.imshow('img', merge_img) cv2.imshow('img2', img1) cv2.waitKey(0)2. 利用通道分離去除票據紅色印章
代碼
import cv2th = 180 # 二值化閾值 src = cv2.imread('image.jpg') blue, green, red = cv2.split(src) gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, th, 255, cv2.THRESH_BINARY)_, red_binary = cv2.threshold(red, th, 255, cv2.THRESH_BINARY) cv2.imshow("src", src) cv2.imshow("gray", gray) cv2.imshow("binary", binary) cv2.imshow("red channel", red) cv2.imshow("blue channel", blue) cv2.imshow("green channel", green) cv2.imshow("red+binary", red_binary)new_img = cv2.merge((blue, green, red_binary)) cv2.imshow("new image", new_img) cv2.waitKey(0) 原圖灰度圖紅色通道圖紅色通道二值化結果“
參考:如何去除票據上的印章: https://www.cnblogs.com/skyfsm/p/7638301.html
往期推薦
【opencv系列01】OpenCV4.X介紹與安裝
【opencv系列02】OpenCV4.X圖像讀取與顯示
【opencv系列03】OpenCV4.X視頻捕獲與顯示
【opencv系列04】OpenCV4.X圖形繪制
【opencv系列05】OpenCV4.X鼠標回調函數
【opencv系列06】OpenCV4.X滑動條操作
長按二維碼關注我們
有趣的靈魂在等你
總結
以上是生活随笔為你收集整理的【opencv系列07】OpenCV4.X图像基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【推荐】一下令人惊艳的的网站,绝对会让你
- 下一篇: CVPR 2019笔迹识别论文:逆鉴别网