1. 程式人生 > >python-opencv-matlab影象處理介面關係

python-opencv-matlab影象處理介面關係

1、說明

 caffe框架由C++編寫,其還提供python和matlab介面呼叫。而caffe的影象讀取與儲存是利用opencv實現,因此需要梳理影象在不同介面中的轉換關係,方便不同介面下的資料傳輸與儲存。
  • 關鍵點:影象檔案在記憶體中的儲存形式是連續儲存的。如果是3通道RGB影象,則其在記憶體中儲存的格式為 r1g1b1,r2g2b2,r3g3b3.........

2、影象讀取及轉換

2.1 python直接呼叫影象

python利用matplotlib庫可直接讀入、顯示、儲存影象。

已知影象大小為(height,width,channel)=(194,295,3);

import matplotlib.pyplot as plt
pyimg=plt.imread('HappyFish.jpg')
plt.imshow(pyimg)
plt.show()

這裡寫圖片描述

檢視讀入的資料型別及大小如下:

print type(pyimg)
print pyimg.shape

這裡寫圖片描述

可知,python儲存影象資料的資料型別為numpy.ndarray型別,資料存放模式為(height,width,channel)=(194,259,3);
(0,0)處的畫素值關係如下:

print pyimg[0,0]

這裡寫圖片描述
從上圖可以看出,(0,0)處的畫素值如上。

2.2 python利用opencv呼叫影象

import cv2
cvimg=cv2.imread('HappyFish.jpg')
cv2.imshow("wnd",cvimg)
cv2.waitKey(0)

這裡寫圖片描述
資料型別及資料呼叫如下:

print type(cvimg)
print cvimg.shape
print cvimg[0,0]

這裡寫圖片描述

可以看出,opencv的python介面同樣是採用numpy.ndarray型別儲存畫素值,儲存方式依然是【height,width,channel】,此種存放模式方便影象畫素值索引,如【0,0】可直接呼叫三個通道的資料。
  • 雖然開啟的同樣一個影象,但是在用 matplotlib讀取的時候與cv2讀取,在【0,0】處的畫素值是不同的,原因是opencv讀影象的時候,畫素在記憶體中的儲存的順序為BGR,而python中為RGB。

2.3 python與opencv 資料之間轉換

利用opencv 讀入影象,利用matplotlib顯示影象

import cv2
cvimg=cv2.imread('HappyFish.jpg')
plt.imshow(cvimg)
plt.show()

這裡寫圖片描述
影象顯示異常,主要是應為opencv將影象畫素的儲存順序改為BRG,而python預設顯示影象格式為RGB.為了顯示正常,可執行如下操作:

#方法1
import cv2
cvimg=cv2.imread('HappyFish.jpg')
b,g,r=cv2.split(cvimg)
rgb=cv2.merge([r,g,b])
plt.imshow(rgb)
plt.show()

#方法2
rgb=cv2.cvtColor(cvimg,cv2.COLOR_BGR2RGB)
plt.imshow(rgb)
plt.show()

#方法3
rgb=cvimg[:,:,::-1]
plt.imshow(rgb)
plt.show()

3、numpy多維陣列相關操作

python中,影象資料儲存的資料格式為numpy.ndarray,因此有必要了解相關操作,特別是transpose和reshape操作。

3.1 reshape

tt=np.arange(24)
/*array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23])
*/
t1=tt.reshape(2,3,4)
/*
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
*/
t2=t1.reshape(4,3,2)
/*
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15],
        [16, 17]],

       [[18, 19],
        [20, 21],
        [22, 23]]])
*/
t2.shape=[2,3,4]
/*
t2=
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
*/

可以看出,reshape不會改變資料在記憶體中的先後順序,改變shape屬性同reshape()函式效果相同。

3.2 transpose

transpose方法,用於改變多維陣列各個維度(通道)上的對映關係。numpy多維陣列的維度(通道)變化規律為:最左端維度最大,變化速率最低,向右維度依次降低,變化速率依次變高。如三維陣列,通道編號分別為 0–>1–>2

t3=t2.transpose(0,2,1)
/*
array([[[ 0,  4,  8],
        [ 1,  5,  9],
        [ 2,  6, 10],
        [ 3,  7, 11]],

       [[12, 16, 20],
        [13, 17, 21],
        [14, 18, 22],
        [15, 19, 23]]])
 某點關係: t3[1,3,2]==t2[1,2,3] t3某點的值映射回t2的索引
*/

為了更加直觀,利用matlab生成如上有三個通道的偽影象塊img,影象大小格式為【height,width,channel】=【5,4,3】。
這裡寫圖片描述

利用python讀入影象,其在記憶體中儲存的資料格式如下所示:
這裡寫圖片描述

看上去有點詭異,沒有matlab單通道獨立顯示的方式直觀,但是,這種儲存格式方便畫素直接索引,如img[0,0]可直接返回三個通道的畫素值 【1,2,4】 

可不可以利用transpose將python格式的影象,轉化為類似與matlab單通道的表示形式,當然可以:

imgt=img.transpose(2,0,1)  ## 好強大
/*
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4]]], dtype=uint8)
*/

利用opencv讀取img,如下,在次證明了畫素值按照BGR格式儲存的事實。

ccimg=cv2.imread('img.jpg')
/*
array([[[4, 2, 1],
        [4, 2, 1],
        [4, 2, 1],
        [4, 2, 1]],

       [[4, 2, 1],
        [4, 2, 1],
        [4, 2, 1],
        [4, 2, 1]],

       [[4, 2, 1],
        [4, 2, 1],
        [4, 2, 1],
        [4, 2, 1]],

       [[4, 2, 1],
        [4, 2, 1],
        [4, 2, 1],
        [4, 2, 1]],

       [[4, 2, 1],
        [4, 2, 1],
        [4, 2, 1],
        [4, 2, 1]]], dtype=uint8)
*/

相關推薦

python-opencv-matlab影象處理介面關係

1、說明 caffe框架由C++編寫,其還提供python和matlab介面呼叫。而caffe的影象讀取與儲存是利用opencv實現,因此需要梳理影象在不同介面中的轉換關係,方便不同介面下的資料傳輸與儲存。 關鍵點:影象檔案在記憶體中的儲存形式是連續儲

python進階—OpenCV影象處理(二)

文章目錄 影象形態變換 影象的腐蝕 影象的膨脹 影象的開操作 影象的閉操作 影象的形態學梯度 影象的頂帽操作 影象的黑帽操作 影象的梯度(Image Gradients) So

python進階—OpenCV影象處理(一)

文章目錄 顏色空間轉換 RGB色彩空間 HSV色彩空間 YUV色彩空間 簡單的物體跟蹤示例 HSV空間目標閾值選取 影象幾何變換 影象的縮放 影象的位移 影象的旋轉 影

OpenCV數字影象處理】(4) 【Python程式設計】(4) 平移

配套使用的OpenCV版本:2.4.9 ; Python版本:2.7 主要參考文章(感謝作者分享) 程式極其類似於參考文章1、文章1使用的是OpenCV2.0,而OpenCV2.49的寫法稍有不同 效果參考文章1,語法參考文章2 主要思想(轉載自文章1)

python 中的 常用 opencv 以及影象處理相關函式總結整理

1.讀取圖片 img = cv2.imread("D:\cat.jpg")   ,OpenCV目前支援讀取bmp、jpg、png、tiff等常用格式。 建立一個視窗    cv2.namedWindow("Image")   然後在視窗中顯示影象     cv2.ims

QT+opencv實現簡單的影象處理介面

本來實現的功能是比較簡單的,但在實現過程中遇到不少問題,所以就寫下來作為一個小結,也可以供大家參考: 實現的目標視窗如下: 1、其中選單欄的檔案裡實現開啟測試檔案,開啟自定義檔案,還原影象,清除影象,退出系統等功能,這些功能的實現可以參考《opencv程式設計案例》這本書

opencv-python函式(三)影象處理

1.顏色空間轉換 常用到的就兩種:BGR↔Gray 和 BGR↔HSV 要用到的函式是:cv2.cvtColor(input_image ,flag),其中 flag就是轉換型別。 對於 BGR↔Gray 的轉換,我們要使用的 flag 就是 cv2.COLOR_BGR

【AI基礎】python:openCV——圖像處理(1)

python python:openCV OpenCV圖像的基本操作 :使用包cv2,numpy import cv2 import numpy as np img = cv2.imread(‘1.jpg‘) cv2.imshow(‘image‘,img) k = cv2.waitKey(0) "

【AI基礎】python:openCV——圖像處理(2)

getTrackbarPos圖像處理練習 制作一個滑動條調色板,使用函數cv2.getTrackbarPos();cv2.creatTrackbar() import cv2 import numpy as np def nothing(x): pass img = np.zeros((300,5

Python+OpenCV圖像處理(一)——讀取顯示一張圖片

沒有 class 釋放資源 圖像 Coding 路徑 troy 如果 nco   配置好所有環境後,開始利用python+opencv進行圖像處理第一步。   讀取和顯示一張圖片: import cv2 as cv src=cv.imread(‘E:\imageload\

Python+OpenCV圖像處理(五)—— ROI與泛洪填充

targe ros com ray inter color 方式 高度 lan 一、ROI ROI(region of interest),感興趣區域。機器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規則多邊形等方式勾勒出需要處理的區域,稱為感興趣區域,ROI。

Python+OpenCV圖像處理(十四)—— 直線檢測

gap mat rgb2gray inf 單位 imshow width 結果 pre 簡介: 1.霍夫變換(Hough Transform) 霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進算法。主要用來從圖像中分離出具有某種相同特征的幾何

python+opencv圖像處理(一)

strong dct變換 mage uid 操作系統 之間 mea numpy 包括 一、什麽是opencv?     Open Source Computer Vision Library.OpenCV於1999年由Intel建立,如今由Willow Garage提供支持

Python+OpenCV圖像處理(十六)—— 輪廓發現

draw 一個 設置 在外 ace align list tco 灰度 簡介:輪廓發現是基於圖像邊緣提取的基礎尋找對象輪廓的方法,所以邊緣提取的閾值選定會影響最終輪廓發現結果。 代碼如下: import cv2 as cv import numpy as np def c

[python-opencv]超大影象二值化方法

*分塊 *全域性閾值 VS 區域性閾值   1 import cv2 as cv 2 import numpy as np 3 4 def big_image_binary(image): 5 print(image.shape) 6 cw = 213 7

Python OpenCV _3形態學處理(腐蝕膨脹,開閉運算,以及利用形態學進行邊緣角點檢測)

Python OpenCV這個初級影象處理系列是參考他人的文章寫的,有些地方做了一些改動,沒有太多理論,側重程式碼實現,主要目的是將這些基本操作程式碼系統地梳理一遍,也是為了以後能快速查詢。 此係列原始碼在我的GitHub裡:https://github.com/yeyujujishou19/P

OpenCV+OCR 影象處理字元識別原理及程式碼

需配置好OpenCV和OCR環境下執行 1、OpenCV簡介 OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫。 OpenCV用C++語言編寫,它的主要介面也是C++語言,但是依然保留了大量的C語言介

使用OpenCV進行影象處理-改變影象的亮度與對比度

通過OpenCV,製作一個有關影象處理的在Linux下的軟體。 製作可以自動處理影象亮度的簡單軟體。 開發環境:CodeBlocks #include <iostream> #incl

使用Python-OpenCV消除影象中孤立的小區域

之前一直使用Skimage中的形態學處理來進行孤立小區域的去除,程式碼如下 img = morphology.remove_small_objects(img, size) img = morphology.remove_small_holes(img, size) 後面

Matlab 影象處理 筆記

批量儲存視訊每一幀影象:  video = VideoReader('realSample.avi'); % 讀取視訊檔案 nFrames = video.NumberOfFrames;   %得到幀