天天看點

openCV 圖像處理入門

本文章介紹opencv 的基礎基礎圖像處理API和部分API原理,包括圖像的讀寫和展示,圖像的旋轉,縮放,平移,鏡像,仿射變換。使用python 語言編寫。版本 3.6 ,opencv 3 版本

01 圖檔的讀寫和展示:

import cv2
# 讀取目前檔案夾下面image.png 圖檔,  1 表示彩色方式讀取, 0 表示黑白讀取
img=cv2.imread("image.png",1)
# 展示這個圖檔,彈出視窗的标題是 “image”
cv2.imshow('image',img)
# 防止程式閃退,圖像視窗等待使用者手動關閉
cv2.waitKey(0)
           
-1
           
import cv2
# 讀取一個圖像檔案
img=cv2.imread('image.png',1)
# 将圖像檔案寫入一個新檔案。
cv2.imwrite('image.jpg',img)
           
True
           
# 在圖檔檔案中畫一條線(實際上就是對圖像矩陣做顔色變化)
import cv2
img=cv2.imread("image.jpg",1)
(b,g,r)=img[100,100]
print(b,g,r)

# 在 (10,100) -----(110,100)畫一條藍色的線段
for i in range(1,100):
    #圖檔顔色模式是(b,g,r)的
    img[10+i,100]=(255,0,0)
cv2.imshow("image",img)
cv2.waitKey(0)
           

02圖檔縮放

# 使用opencv 的API resize 來進行縮放
import cv2
img=cv2.imread("image.png",1)
imageInfo=img.shape
print(imageInfo)
# 輸出表示長寬,模式為RGB
width=imageInfo[1]
height=imageInfo[0]
mode=imageInfo[2]
# 定義縮放後的大小
new_width=int(width*0.5)
new_height=int(height*0.5)
# 使用resize 函數進行縮放
new_img=cv2.resize(img,(new_width,new_height))
cv2.imshow('resize after',new_img)
cv2.imshow('resize before',img)
cv2.waitKey(0)
           
(678, 1464, 3)
-1
           
# 使用最近鄰域插值原理實作縮放
# 最近鄰域插值是計算機圖形學的基礎知識,則這裡不贅述,需要可以自行百度
import cv2
import numpy as np
img=cv2.imread("image.png",1)
imageInfo=img.shape
width=imageInfo[1]
height=imageInfo[0]
mode=imageInfo[2]
# 定義縮放之後的大小
rate =0.5
new_width=int(width*rate)
new_height=int(height*rate)
# 建立一個空白的模闆:
# 數值類型是 8位無符号整數,表示的範圍是 0- 255 
blank=np.zeros((new_height,new_width,mode),np.uint8)
for row in range(0,new_height):
    for col in range(0,new_width):
        row_temp=int(row*(height*1.0/new_height))
        col_temp=int(col*(width*1.0/new_width))
        blank[row,col]=img[row_temp,col_temp]
cv2.imshow('after resize',blank)
cv2.imshow('before resize',img)
cv2.waitKey(0)
           
-1
           

03圖檔剪切

# 圖檔剪切實際上就是将圖檔上的某一部分複制到新的圖檔上的國哦成
import cv2
img=cv2.imread("image.png",1)
# 截取 200-300 行,300-400列的圖像部分:
new_img=img[100:200,300:400]
cv2.imshow('image',new_img)
cv2.waitKey(0)
           
-1
           

圖檔移位

import cv2
import numpy as np
img=cv2.imread('image.png',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
# 定義移位矩陣: (2 x 3 的矩陣)
matshift=np.float32([[1,0,100],[0,1,200]])
# 生成目标圖像
# warpAffine(原圖,運算矩陣,(原圖像高,原圖像寬))
new_img=cv2.warpAffine(img,matshift,(width,height))
cv2.imshow("after shift",new_img)
cv2.waitKey(0)
           
-1
           
# 圖檔移位算法原理
"""
(1) 矩陣算法(以上面的矩陣為例)
matshift=[[1,0,100],[0,1,200]]   2 x 3
可以拆分成兩個矩陣:
A=[[1,0],[0,1]]   2 x 2
B=[[100],[200]]   2 x 1
C=xy    2 x 1
A*C+B=[[1*x+0*y],[0*x+1*y]]+[[100],[200]] = [[x+100],[y+200]]
(2) 映射方法:
原圖點+偏移=目标圖點:
例如  (10,20)-->(110,220)
"""
import cv2
import numpy as np
img=cv2.imread('image.png',1)
cv2.imshow('src', img)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
new_img=np.zeros(imageInfo,np.uint8)

# 實作移位功能:
for row in range(100,height):
    for col in range(200,width):
        new_img[row,col]=img[row-100,col-200]
cv2.imshow("after shift",new_img)
cv2.waitKey(0)
           
-1
           

04圖檔鏡像變換

# 任務: 将圖像以水準方線為軸做對稱變換
import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]
new_img=np.zeros((height*2,width,mode),np.uint8)

for row in range(0,height):
    for col in range(0,width):
        new_img[row,col]=img[row,col]
        new_img[row+height,col]=img[height-1-row,col]

# 繪制水準線
for i in range(0,width):
    new_img[height,i]=(0,0,255)
    new_img[height-1,i]=(0,0,255)
cv2.imshow('after screen operation',new_img)
cv2.waitKey(0)
           
-1
           

05實作圖檔的仿射變換

import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]

# 從原圖上找三個點(可以确定唯一的一個面)
matsrc=np.float32([[0,0],[0,height-1],[width-1,0]])
# 給出這三個點被映射到新圖的位置:
mat_new_img=np.float32([[50,50],[300,height-200],[width-300,100]])

matAffine=cv2.getAffineTransform(matsrc,mat_new_img)
new_img=cv2.warpAffine(img,matAffine,(width,height))
cv2.imshow('after',new_img)
cv2.waitKey(0)
           
-1
           

06圖檔旋轉

import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]

# 旋轉矩陣:
# 第一個參數是旋轉的基礎點(以哪個點進行旋轉) 第二個是旋轉的角度
# 第三個是縮放的比率
matRotate=cv2.getRotationMatrix2D((width/2,height/2),45,0.5)
new_img=cv2.warpAffine(img,matRotate,(width,height))
cv2.imshow('after rotate',new_img)
cv2.waitKey(0)
           

07線段繪制

import cv2
import numpy as np
# 定義畫布的大小和顔色深度:
# 這裡定義畫布大小為 高 500 寬 500 顔色深度為 3
imageInfo=(500,500,3)

img=np.zeros(imageInfo,np.uint8)

# 繪制線段:
# 第一個參數是畫布,第二個參數是起始點,第三個參數是終止點,第四個參數是顔色(b,g,r)
cv2.line(img,(100,100),(400,400),(0,0,255))
# 第五個參數是線的寬度
cv2.line(img,(100,100),(400,100),(0,0,255),20)
# 第六個參數為線條的類型:這裡選擇的類型可以消除鋸齒:
cv2.line(img,(100,400),(400,400),(0,0,255),cv2.LINE_AA)
cv2.imshow("new image",img)
cv2.waitKey(0)
           
-1
           

08 矩形圓形和多邊形繪制

import cv2
import numpy as np
# 定義畫布的大小和顔色深度:
# 這裡定義畫布大小為 高 500 寬 500 顔色深度為 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 繪制矩形:
# 第一個參數是畫布,第二個參數是左上角的點,第三個參數是右下角的點,第四個參數是顔色,第五個參數是線條寬度
# 如果第五個參數是 -1 ,代表了填充, 大于0 的話代表的是線條寬度。
cv2.rectangle(img,(100,100),(200,200),(255,0,0),-1)
cv2.rectangle(img,(300,300),(400,400),(0,255,0),5)
cv2.imshow("new image",img)
cv2.waitKey(0)
           
-1
           
# 繪制圓形和橢圓形
import cv2
import numpy as np
# 定義畫布的大小和顔色深度:
# 這裡定義畫布大小為 高 500 寬 500 顔色深度為 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 繪制圓形:
# 繪制圓形和橢圓形
import cv2
import numpy as np
# 定義畫布的大小和顔色深度:
# 這裡定義畫布大小為 高 500 寬 500 顔色深度為 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 繪制圓形:
# 參數和矩形的大概一緻,隻是第二個參數是圓心位置,第三個參數是半徑。
cv2.circle(img,(100,100),50,(0,255,255),-1)
cv2.circle(img,(300,100),50,(0,255,0),3)

# 繪制橢圓形
# 參數:畫布大小,(長軸和短軸) 起始偏轉角度,起始角度,終止角度,顔色,填充和線寬。
cv2.ellipse(img,(300,300),(150,100),45,0,360,(0,255,255),-1)

cv2.ellipse(img,(130,400),(100,40),0,0,360,(0,255,255),-1)
cv2.imshow("new image",img)
cv2.waitKey(0)
           
-1
           

09 繪制任意多邊形

import cv2
import numpy as np
# 定義畫布的大小和顔色深度:
# 這裡定義畫布大小為 高 500 寬 500 顔色深度為 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 繪制任意的多邊形
# 首先定義多邊形的點集合:
points=np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32)
points=points.reshape((-1,1,2))
cv2.polylines(img,[points],True,(0,255,255))

cv2.imshow("new image",img)
cv2.waitKey(0)
           
-1
           

10 繪制文字和圖像

# 繪制文字和圖像到畫布
import cv2
import numpy as np
font=cv2.FONT_HERSHEY_COMPLEX
# 定義畫布的大小和顔色深度:
# 這裡定義畫布大小為 高 500 寬 500 顔色深度為 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
copy=cv2.imread("img.png",1)

# 繪制文字
cv2.putText(img,"hello world!",(150,350),font,1,(255,0,0),2,cv2.LINE_AA)
# 繪制圖像
print(copy.shape)
# 定義繪制圖像的大小:
width=175
height=175
# 定義繪制圖像的位置:
local=[100,160]
for i in range(0,height):
    for j in range(0,width):
        img[i+local[0],j+local[1]]=copy[i,j]

cv2.imshow("old image",copy)
cv2.imshow("new image",img)
cv2.waitKey(0)
           
(1188, 2109, 3)
-1