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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【opencv系列07】OpenCV4.X图像基本操作

發布時間:2025/1/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 uint8

Note

  • 注意如果圖像是灰度圖像,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函數

import cv2 img = cv2.imread('img.jpg') b,g,r = cv2.split(img) #拆分圖像通道 img = cv2.merge((b,g,r))
  • numpy切片

b = img[:,:,0]

單通道所有像素置零

img[:,:,2] = 0

NOTE:
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图像基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。