opencv图像的基础操作
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                opencv图像的基础操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            目標
? 獲取像素值并修改
? 獲取圖像的屬性(信息)
? 圖像的ROI()
? 圖像通道的拆分及合并
 
                        
                        
                        ? 獲取像素值并修改
? 獲取圖像的屬性(信息)
? 圖像的ROI()
? 圖像通道的拆分及合并
幾乎所有這些操作與Numpy 的關系都比與OpenCV 的關系更加緊密,因此熟練Numpy 可以幫助我們寫出性能更好的代碼。
# -*- coding: utf-8 -*- """ Created on Mon Jan 22 13:26:57 2018 """import cv2 import numpy as np from matplotlib import pyplot as plt#opencv 讀圖 img = cv2.imread("E:\\python\\opencv\\images\\demo0.png")#根據像素的行和列的坐標獲取他的像素值。對BGR 圖像而言,返回值為B,G,R 的值。對灰度圖像而言,會返回他的灰度值 ''' px=img[100,100] print px blue=img[100,100,0] print blue '''#修改像素值 ''' img[100,100]=[255,255,255] print img[100,100] '''#獲取像素值及修改的更好方法。 ''' print img.item(10,10,2) img.itemset((10,10,2),100) print img.item(10,10,2) '''#獲取圖像屬性,圖像的屬性包括:行,列,通道,圖像數據類型,像素數目等''' print img.shape print img.size print img.dtype #(552L, 1112L, 3L) #1841472 #uint8 '''#圖像ROI,有時你需要對一幅圖像的特定區域進行操作。 ''' ball=img[280:340,330:390] img[273:333,100:160]=ball '''#拆分及合并圖像通道,有時我們需要對BGR 三個通道分別進行操作。這是你就需要把BGR 拆分成單個通道。有時你需要把獨立通道的圖片合并成一個BGR 圖像。你可以這樣做: #:cv2.split() 是一個比較耗時的操作。只有真正需要時才用它,能用Numpy 索引就盡量用。 ''' b,g,r=cv2.split(img) img=cv2.merge(b,g,r) #或者 b=img[:,:,0] #或者 img[:,:,2]=0 '''#為圖像擴邊(填充) ''' 如果你想在圖像周圍創建一個邊,就像相框一樣,你可以使用cv2.copyMakeBorder()函數。這經常在卷積運算或0 填充時被用到。這個函數包括如下參數: ? src 輸入圖像 ? top, bottom, left, right 對應邊界的像素數目。 ? borderType 要添加那種類型的邊界,類型如下 – cv2.BORDER_CONSTANT 添加有顏色的常數值邊界,還需要下一個參數(value)。 – cv2.BORDER_REFLECT 邊界元素的鏡像。比如: fedcba|abcdefgh|hgfedcb – cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一樣,但稍作改動。例如: gfedcb|abcdefgh|gfedcba – cv2.BORDER_REPLICATE 重復最后一個元素。例如: aaaaaa|abcdefgh|hhhhhhh – cv2.BORDER_WRAP 不知道怎么說了, 就像這樣: cdefgh|abcdefgh|abcdefg ? value 邊界顏色,如果邊界的類型是cv2.BORDER_CONSTANT ''' #看下面的小例子 ''' img1 = img BLUE=[255,0,0] 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() '''#圖像上的算術運算#你可以使用函數cv2.add() 將兩幅圖像進行加法運算,當然也可以直接使用numpy,res=img1+img。兩幅圖像的大小,類型必須一致,或者第二個圖像可以使一個簡單的標量值。 #OpenCV 中的加法與Numpy 的加法是有所不同的。OpenCV 的加法是一種飽和操作,而Numpy 的加法是一種模操作。 ''' x = np.uint8([250]) y = np.uint8([10]) print cv2.add(x,y) # 250+10 = 260 => 255 print x+y # 250+10 = 260 % 256 = 4 ''' #圖像混合,函數cv2.addWeighted() 可以按下面的公式對圖片進行混合操作。 ''' img1=img img2=cv2.imread('E:\\python\\opencv\\images\\demo2.png') dst=cv2.addWeighted(img1,0.7,img2,0.3,0) ''' #使用OpenCV 檢測程序效率 ''' e1 = cv2.getTickCount() # your code execution e2 = cv2.getTickCount() time = (e2 - e1)/ cv2.getTickFrequency() '''cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows()
 
總結
以上是生活随笔為你收集整理的opencv图像的基础操作的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: opencv读取图片、视频、摄像头
- 下一篇: OpenCV 中的图像处理
