樹莓派-圖像處理Python

樹莓派中進行圖像處理-Python

代碼:

import cv2 #導入opencv庫
import numpy as np
#…
#讀取一張圖片,地址不能帶中文
‘’’
第二個參數,取值可爲:
cv2.IMREAD_COLOR:默認參數,讀入一副彩色圖片,忽略alpha通道
cv2.IMREAD_GRAYSCALE:讀入灰度圖片
cv2.IMREAD_UNCHANGED:讀入完整圖片,包括alpha通道(png有,jpg無)
‘’’
imgviewx=cv2.imread(“ha.png”,cv2.IMREAD_COLOR)
#…
#獲取圖片信息
#一個像素有三個通道,BGR
print(imgviewx.shape)#輸出:(1080, 1920, 3) 高像素,寬像素,通道數
print(imgviewx.size)# 120000 總通道數=高* 寬* 通道數
print(imgviewx.dtype)# uint8 3個通道每個通道佔的位數(8位,一個字節)
#print(imgviewx) #輸出效果視乎與下條相同
#print(np.array(imgviewx)) #輸出每個像素點的參數( B , G , R )
#獲取圖片 B G R 各均值, #(204.46305102040816, 208.50832244897958, 217.29540408163263, 0.0) ,紅色部分最多
print(cv2.mean(imgviewx))
#獲取方差,也會打印均值,可用均值方差都爲零判斷圖片無效
#print(cv2.meanStdDev(imgviewx))
#…
#圖片處理
#備份圖片
imgviewx1=imgviewx.copy()
#均值模糊,主要用於去除圖片噪點
#讀取圖片並實現圖片的模糊效果,參數:(讀取圖片,(X軸方向模糊,Y軸方向模糊))
#imgviewx=cv2.blur(imgviewx,(5,5))
#中值模糊,主要用於去除椒鹽(燒烤配料)噪點
#參數:(圖片信息,模糊值)
#imgviewx=cv2.medianBlur(imgviewx,9)
#普通高斯模糊
#參數:(圖片信息,參數1,參數2)參數1和參數2只能設置一個
#imgviewx=cv2.GaussianBlur(imgviewx,(0,0),1)
#保留邊緣(像素差),高斯模糊
#參數(圖片信息,0,要用怎樣的方式(越大則越細),空間複雜度(越大越複雜))
imgviewx=cv2.bilateralFilter(imgviewx,0,50,6)
#美顏,美白效果valuex值越大越白
#valuex=50;
#imgviewx=cv2.bilateralFilter(cv2.imread(“imgx/zcy.jpg”),valuex,valuex * 2,valuex / 2)
#對比度和亮度調整
#duix=0.5 #對比度
#lightx=0 #亮度
#imgviewx=cv2.addWeighted(imgviewx,duix,np.zeros(imgviewx.shape,imgviewx.dtype),1-duix,lightx)
#顯示文字
#參數:圖像,文字內容, 座標( x , y ) ,字體,大小,顏色( B , G ,R ),字體厚度
#顏色值爲0-255
font = cv2.FONT_HERSHEY_SIMPLEX # 定義字體
imgviewx = cv2.putText(imgviewx,“hhh”,(10, 50), font, 1.2, (0, 0, 255), 5)
#像素取反
#imgviewx=cv2.bitwise_not(imgviewx)
#遍歷圖片,效率低,不推薦使用
def xgtp():
global imgviewx
gx,kx,tx=imgviewx.shape#得到像素高度,像素寬度,通道數
for g in range(0,gx):
for k in range(0,kx): #這裏得到的是每個像素點,每個點由RGB三色構成
if(k>0 and k<100):
imgviewx[g,k,0]=0 # B
imgviewx[g,k,1]=255 # G
imgviewx[g,k,2]=255 # R
else:
imgviewx[g, k, 0] = imgviewx[g, k, 0] #獲取到原來的值
imgviewx[g, k, 1] = imgviewx[g, k, 1]
imgviewx[g, k, 2] = imgviewx[g, k, 2]
#創建一個圖形,使用np,所以效率高
def cjtx():
# 初始化像素點值全爲0 (rgb都爲零,所以是黑色)
#參數:([高,寬,通道數],每個通道佔的位數(一個字節))
imgx=np.zeros([400,600,3],np.uint8)
#初始化像素點值爲全爲1
#imgx[110:130,50:70,2]表示一個範圍:[高度起始點:高度結束點,寬度起始點:寬度結束點,哪個通道],起始點均以左上角
#imgx[:,:,0]=np.ones([400,600],np.uint8)*255 #最終結果爲第一個通道(B)全爲255,所以是藍色
imgx[110:130,50:70,1]=np.ones([20,20],np.uint8)255
cv2.imshow(“第二個圖形窗口”,imgx)
#圖片區域處理
def pictureArea():
global imgviewx
#得到截圖
areax=imgviewx[110:529,778:1200]
#將圖片由RGB(3通道)轉換爲灰度(2通道)
areax=cv2.cvtColor(areax,cv2.COLOR_BGR2GRAY)
#將圖片有2通道還原成3通道,但色彩不能還原
areax2=cv2.cvtColor(areax,cv2.COLOR_GRAY2RGB)
#處理後的區域寫到原圖上
imgviewx[110:529, 778:1200]=areax2
#顯示截圖
cv2.imshow(“area”,areax)
#泛洪填充,相似像素填充
def fill_color():
global imgviewx
h,w,t=imgviewx.shape
#必要參數
maskx=np.zeros([h+2,w+2],np.uint8)
#參數接收:(圖片信息,必要參數,參考點位置座標,填充的顏色,查找範圍:最低像素(參考減所寫),查找範圍:最高像素(參考加所寫),全部填充) cv2.floodFill(imgviewx,maskx,(100,100),(0,255,0),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)
#通道分離與合併
def tongdao():
global imgviewx
b,g,r=cv2.split(imgviewx)#通道分離
cv2.imshow(“bb”,b)#通道圖單獨顯示
cv2.imshow(“gg”,g)
cv2.imshow(“rr”,r)
imgviewx[:,:,1]=135 #改變單個通道(0,1,2 => B,G,R)
cv2.imshow("chang red ",imgviewx)
imgviewx=cv2.merge([b,g,r])#合併通道
#像素運算
def pixel_operation():
#讀入兩張大小和通道相同的圖片
img1=cv2.imread(“imgx/img1.jpg”)
img2=cv2.imread(“imgx/img2.jpg”)
print(img1.shape, “=====”, img2.shape)
# 創建一個大小可調整的窗口
cv2.namedWindow(“operation”, cv2.WINDOW_NORMAL)
cv2.imshow(“img111”, img1)
cv2.imshow(“img222”,img2)
#處理圖片
#像素點相加,如0(黑色),255(白色),0+255=255(白色),超過255還是白色
#imgoperation=cv2.add(img1,img2)
#像素相減,如0(黑色),255(白色),0-255=-255=0(黑色)
#imgoperation=cv2.subtract(img1,img2)
#像素相乘,255(白色),0/255=0(黑色)
#imgoperation=cv2.divide(img1,img2)
#像素相乘,255(白色),0
255=0(黑色)
#imgoperation=cv2.multiply(img2,img1)
#像素與,二進制與,如0與255爲00000000&11111111=00000000
imgoperation=cv2.bitwise_and(img1,img2)
#像素或
imgoperation=cv2.bitwise_or(img1,img2)
#顯示處理後的圖片
cv2.imshow(“operation”, imgoperation)
#…
#視頻處理,視頻無聲音
def vediox():
ved=cv2.VideoCapture(“imgx/vv.mp4”)#打開視頻
while True:
ret,tux=ved.read()
if ret== False:#判斷視頻是否播放完畢
break
else:
cv2.imshow(“wideo1111”,tux)#每幀顯示
hsv=cv2.cvtColor(tux,cv2.COLOR_BGR2HSV)#轉換成HSV圖片格式,對顏色敏感
lowx=np.array([37,43,46])#表格在後面給出
uppx=np.array([77,255,255])
# 播放此輸出的目標是白色
tux2=cv2.inRange(hsv,lowx,uppx)#利用低指和高指匹配延時,所匹配的是綠色
#播放此輸出的目標是原色
tux3 = cv2.bitwise_and(tux,tux, mask=tux2)

        cv2.imshow("video222",tux3)

        if 27==cv2.waitKey(20):#按鍵退出播放
            break

#…
#創建一個窗口,中文顯示會出亂碼,第一個參數爲窗口唯一標識字符串
#窗口大小可調整,默認參數爲c v2.WINDOW_AUTOSIZE 根據圖像大小自動創建大小
#可建多個
cv2.namedWindow(“hhh”,cv2.WINDOW_NORMAL)
#…
#創建鼠標點擊事件回調函數,(事件,x軸位置,y軸位置,標記,屬性)
def drawxxx(event,x,y,flags,param):
if eventcv2.EVENT_LBUTTONDOWN:
print(“鼠標按下”,x,y)
#elif event
cv2.EVENT_MOUSEMOVE:
# print(“鼠標滑動”)
elif eventcv2.EVENT_LBUTTONUP:
print(“鼠標擡起”)
#註冊鼠標監聽事件(窗口,回調函數)
cv2.setMouseCallback("hhh,drawxxx)
#…
t1=cv2.getTickCount()#利用cpu時間…
#xgtp()#調用圖片像素遍歷函數
#cjtx()#調用創建圖形函數
#vediox()#調用視頻處理函數
#tongdao()#通道處理
#pixel_operation()#像素點的加減乘除等處理
#pictureArea()#圖片區域處理
#fill_color()#泛洪填充,相似像素填充
t2=cv2.getTickCount()
timesx=(t2-t1)/cv2.getTickFrequency()
print(“花費時間:%s 毫秒”%(timesx*1000))
#顯示圖片,參數:(窗口唯一標識字符串,imread讀入的圖像)
#可以不基於窗口,可建多個
cv2.imshow(“hhh”,imgviewx)
#…
#將圖片保存,寫入到文件
cv2.imwrite(“2.jpg”,imgviewx)
#…
#窗口退出
#窗口等待任意鍵盤按鍵輸入,0爲一直等待,其他數字爲毫秒數
#等待時間到則返回-1,如有鍵盤按鍵按下則返回按鍵的ASCII碼
#可使用print(cv2.waitKey(0))獲取該按鍵值
keyx=cv2.waitKey(0)
print(keyx)
if keyx
27:
print(“你按下了鍵盤的:ESC鍵”
#…
#銷燬窗口,退出程序
cv2.destroyAllWindows()

運行結果:

該代碼的功能是處理了每個像素,將圖片美化和顯示每個點的座標值
實驗結果:圖片更加清晰,美化了原始圖片,同時圖片左上方顯示“hhhh”
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章