1. 程式人生 > >Python-OpenCV 處理影象(一):基本操作 cv2

Python-OpenCV 處理影象(一):基本操作 cv2

0x00. 圖片讀、寫和顯示操作

安裝好 OpenCV 之後,首先嚐試載入一張最簡單的圖片並顯示出來,程式碼示例:

第一種方式使用cv2.cv的LoadImageShowImageSaveImage函式

import cv2.cv as cv

# 讀圖片
image=cv.LoadImage('img/image.png', cv.CV_LOAD_IMAGE_COLOR)#Load the image
#Or just: image=cv.LoadImage('img/image.png')

cv.NamedWindow('a_window', cv.CV_WINDOW_AUTOSIZE) #Facultative
cv.ShowImage('a_window', image) #Show the image # 寫圖片 cv.SaveImage("thumb.png", thumb) cv.WaitKey(0) #Wait for user input and quit

也可以直接使用cv2的imreadimwriteimshow函式

import numpy as np
import cv2

img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
cv2.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv2.imwrite('messigray.png',img) cv2.destroyAllWindows()

imread函式還可以定義載入的mode,預設是以RGB模式處理圖片:

import cv2
grayImage = cv2.imread('MyPic.png', cv2.CV_LOAD_IMAGE_GRAYSCALE)
# 可選引數CV_LOAD_IMAGE_COLOR (BGR), CV_LOAD_IMAGE_GRAYSCALE (grayscale), CV_LOAD_IMAGE_UNCHANGED(neither)
cv2.imwrite('MyPicGray.png', grayImage)

0x01. 獲取圖片屬性

import cv2
img = cv2.imread('img/image.png')
print img.shape
# (640, 640, 3)
print img.size
# 1228800
print img.dtype
# uint8
# 在debug的時候,dtype很重要

0x02. 輸出文字

在處理圖片的時候,我們經常會需要把一些資訊直接以文字的形式輸出在圖片上,下面的程式碼將實現這個效果:

import cv2.cv as cv

image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image

font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a font

y = image.height / 2 # y position of the text
x = image.width / 4 # x position of the text

cv.PutText(image,"Hello World !", (x,y),font, cv.RGB(255, 255, 255)) #Draw the text

cv.ShowImage('Hello World', image) #Show the image

cv.WaitKey(0)

cv2:

cv2.putText(frame, 'Hello World', (300,100), 0, 0.5, (0,0,255),2)

0x03. 縮放圖片

下面的例子將實現縮放圖片並儲存,這個在使用 OpenCV 做影象處理的時候都是很常用的操作:

import cv2.cv as cv

im = cv.LoadImage("img/alkaline.jpg") #get the image

thumb = cv.CreateImage((im.width / 2, im.height / 2), 8, 3) #Create an image that is twice smaller than the original

cv.Resize(im, thumb) #resize the original image into thumb
#cv.PyrDown(im, thumb)

cv.SaveImage("thumb.png", thumb) # save the thumb image

cv2:

import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

#OR

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

0x04. 影象平移

import cv2
import numpy as np

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

0x05. 影象旋轉

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

0x06. 仿射變換

import cv2
import numpy as np

img = cv2.imread('mao.jpg')
rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getAffineTransform(pts1,pts2)

dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('image',dst)
cv2.waitKey(0)

0x07. 影象顏色變換

實際使用過程中,我們經常也需要對一些圖片的顏色空間做一些改變之類的:

c2.cv:

import cv2.cv as cv
im=cv.LoadImage('img/fruits.jpg',cv.CV_LOAD_IMAGE_COLOR)
res = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3) #cv.CV_32F, cv.IPL_DEPTH_16S, ...
cv.Convert(im, res) 
cv.ShowImage("Converted",res)
res2 = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3)
cv.CvtColor(im, res2, cv.CV_RGB2BGR) # HLS, HSV, YCrCb, ....
cv.ShowImage("CvtColor", res2)
cv.WaitKey(0)
  • cv.Convert():將圖片從一個顏色空間轉到另一個顏色空間

  • cv.CvtColor(src, dst, code):

cv2:

cv2.cvtColor(input_image, flag)函式實現圖片顏色空間的轉換,flag 引數決定變換型別。如 BGR->Gray flag 就可以設定為 cv2.COLOR_BGR2GRAY 。

一個簡單的例子,下面的程式碼實現識別攝像視訊中藍色的部分:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # 讀取視訊的每一幀
    _, frame = cap.read()

    # 將圖片從 BGR 空間轉換到 HSV 空間
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 定義在HSV空間中藍色的範圍
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # 根據以上定義的藍色的閾值得到藍色的部分
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

以上的程式碼給出了視訊中獲取興趣物件的基本思想。

0x08. 通道的拆分/合併處理

對於一張圖片的 R、G、B 通道,我們可以很方便的使用 OpenCV 獲取並分離或者合併:

(這是將影象灰度化處理的一種方式)

cv2.cv

import cv2.cv as cv

orig = cv.LoadImage('img/fruits.jpg')
b = cv.CreateImage(cv.GetSize(orig), orig.depth, 1)
g = cv.CloneImage(b)
r = cv.CloneImage(b)
cv.Split(orig, b, g, r, None)

merged = cv.CreateImage(cv.GetSize(orig), 8, 3)
cv.Merge(g, b, r, None, merged)

cv.ShowImage("Image", orig)
cv.ShowImage("Blue", b)
cv.ShowImage("Green", g)
cv.ShowImage("Red", r)
cv.ShowImage("Merged", merged)

cv.WaitKey(0)

cv2

import cv2
img = cv2.imread('img/image.png')
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))

0x09. 圖片新增邊距

cv2.copyMakeBorder函式

import cv2
import numpy as np

BLUE = [255,0,0]

img1 = cv2.imread('opencv_logo.png')

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)

相關推薦

Python-OpenCV 處理影象基本操作 cv2

0x00. 圖片讀、寫和顯示操作 安裝好 OpenCV 之後,首先嚐試載入一張最簡單的圖片並顯示出來,程式碼示例: 第一種方式使用cv2.cv的LoadImage、ShowImage和SaveImage函式 import cv2.cv as cv # 讀圖片 image=cv.LoadImage('img

Python-OpenCV 處理影象基本操作

0x00. 圖片讀、寫和顯示操作 安裝好 OpenCV 之後,首先嚐試載入一張最簡單的圖片並顯示出來,程式碼示例: 第一種方式使用cv2.cv的LoadImage、ShowImage和SaveImage函式 import cv2.cv as cv # 讀圖片 image=

Python-OpenCV 處理影象影象畫素點操作

https://segmentfault.com/a/1190000003742442 0x01. 畫素 有兩種直接操作圖片畫素點的方法: 第一種辦法就是將一張圖片看成一個多維的list,例如對於一張圖片im,想要操作第四行第四列的畫素點就直接 im[3,3] 就可以獲取到這個點的RGB值。 第二種就是

【AI實戰】快速掌握Tensorflow基本操作

Tensorflow是Google開源的深度學習框架,來自於Google Brain研究專案,在Google第一代分散式機器學習框架DistBelief的基礎上發展起來。Tensorflow於2015年11月在GitHub上開源,在2016年4月補充了分散式版本,最新版本為1.10,2018年

Python Django 學習筆記-------Django基本操作及後端get解析

1.需求 釋出會簽到系統,嘉賓(Guest)管理和釋出會(Event)管理,增加發佈會搜尋和嘉賓搜尋功能 1.1前端實現嘉賓搜尋介面(guest_manage.html): <!--嘉賓管理搜尋表單--> <!--

arcpy示範教學基本操作

lis style 工作 寫入 open nbsp arch work for arcpy基本操作 打開目錄,遍歷目錄,打開要素類,遍歷要素,打開文件,寫入屬性值 import arcpy import codecs # 設置工作目錄 arcpy.env.

數字影象處理筆記利用OpenCV的Cameo框架搭建實驗環境

1 - 引言 Python的應用程式可以通過面向物件的方法來實現,OpenCV提供了一個Cameo框架可以捕捉電腦的攝像頭。我們可以通過編寫新增框架裡的類和方法來對攝像頭捕捉到的畫面進行影象處理和實驗,是一個很好的學習方法,下面讓我們來搭建一下這個Cameo框架 2 - 使用mana

Python + OpenCV 學習筆記>>> 影象的載入與儲存

影象屬性: 通道數目 高與寬 畫素資料 影象型別 顯示一張圖片: import cv2 as cv src = cv.imread("/home/pi/Desktop/apple.jpg") cv.namedWindow("input im

Python-OpenCV 處理視訊 標記運動軌跡 運動檢測 運動方向判斷

0x00. 光流 光流是進行視訊中運動物件軌跡標記的一種很常用的方法,在OpenCV中實現光流也很容易。 CalcOpticalFlowPyrLK 函式計算一個稀疏特徵集的光流,使用金字塔中的迭代 Lucas-Kanade 方法。 簡單的實現流程: 載入一段視訊。

python簡單處理圖片2影象通道\幾何變換\裁剪

一、影象通道 1、彩色影象轉灰度圖 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') gray=img.convert('L') plt.figure(

Python3+OpenCV學習筆記影象載入、顯示和儲存

img = cv2.imread('Rachel.jpg')載入影象後,當然需要顯示出來,我們才能看到,所以,接下來用到第二個函式cv2.imshow(windowname, filename)“windowname”輸入顯示視窗的名稱,引數型別str,需要開啟多個視窗時,只需要“windowname”不同

Python爬蟲基本概念

popu 通用 字符 spider dai 自身 部分 螞蟻 people 網絡爬蟲的定義 網絡爬蟲(Web Spider。又被稱為網頁蜘蛛。網絡機器人,又稱為網頁追逐者),是一種依照一定的規則,自己主動的抓取萬維網信息的程序或者腳本。另外一些不常使用

Python地理位置資訊庫geopy的使用基本使用

geopy是Python關於地理位置的一個第三方庫,用這個庫來進行地址位置資訊的查詢和轉換非常方便,本文介紹關於geopy的常用的幾種用法 geopy的安裝 pip install geopy 根據地址查詢座標及詳細資訊 >>> import json, logging &

Python資料處理為什麼要學習 Numpy & Pandas?

今天我們介紹兩個科學運算當中最為重要的兩個模組,一個是numpy,一個是 pandas。任何關於資料分析的模組都少不了它們兩個。 一、主要用途: 資料分析 機器學習 深度學習 二、為什麼使用 numpy & pandas

OpenCV學習記錄使用haar分類器進行人臉識別

https://blog.csdn.net/hongbin_xu/article/details/74202193 OpenCV支援的目標檢測的方法是利用樣本的Haar特徵進行的分類器訓練,得到的級聯boosted分類器(Cascade Classification)。

Spring Cloud Stream消費失敗後的處理策略自動重試

之前寫了幾篇關於Spring Cloud Stream使用中的常見問題,比如: 如何處理訊息重複消費 如何消費自己生產的訊息 下面幾天就集中來詳細聊聊,當訊息消費失敗之後該如何處理的幾種方式。不過不論哪種方式,都需要與具體業務結合,解決不同業務場景可能出現的問題。 今天第一節,介紹一下Spring Clo

python裝飾器用法計算一個函式執行所需要的時間

import time from functools import wraps def time_this_function(func): #作為裝飾器使用,返回函式執行需要花費的時間

玩轉OpenCV 4.0呼叫Dis光流演算法示例

玩轉OpenCV 4.0(一):呼叫Dis光流演算法示例 呼叫DIS光流的原始碼如下: 對應CMakelists如下: 呼叫DIS光流的原始碼如下: #include "opencv2/core/utility.hpp"

Boost——字串處理字串操作

由於這一章內容過多,我將採用三個小章,精簡原文三個小部分內容。 區域設定: setlocale(LC_ALL,“”) locale::global(std::locale("German")); //設定全域性區域德語環境 字串操作: 一、將字串所有字元轉成大寫

Python資料處理為什麼要學習 Numpy & Pandas?

今天我們介紹兩個科學運算當中最為重要的兩個模組,一個是numpy,一個是 pandas。任何關於資料分析的模組都少不了它們兩個。 一、主要用途: 資料分析 機器學習 深度學習 二、為什麼使用 n