python版OpenCV常用api调用

记录下: https://blog.csdn.net/JsonD/article/details/84983702

以下所有操作都基于这三个库:

import cv2 
import numpy as np 
import matplotlib.pylab as plt

1、图片读取

img=cv2.imread('image/lenacolor.png',cv2.IMREAD_UNCHANGED)

原图展示
cv2.IMREAD_UNCHANGED

灰度图展示
cv2.IMREAD_GRAYSCALE

彩色图展示
cv2.IMREAD_COLOR

2、图片保存

cv2.imwrite('image/gray_test.jpg',img)

3、图片展示

cv2.imshow('original',img)

4、图片暂停展示

##num<0 按键输入消失
##num==0 或不填系数 ,一直不消失
##num>0 停滞num秒 
cv2.waitKey(num)

5、 关闭所有窗口

cv2.destroyAllWindows()

6、图像赋值

1)基本操作

img[100,100]=255 #灰度图赋值 
img[100,100,0]=255 #彩色图单通道赋值 
img[100,100]=[255,255,255] #彩色图多通道赋值

2)numpy操作

img.item(100, 100, 2) #获得(100,100)点,2通道的值 
img.itemset((100, 100, 2), 255) #设置(100,100)点2通道的值

7、获取图像属性

##获取BGR图 高、宽、深度 
h,w,d=img.shape
##获得图片大小 h*w 或 h*w*d 
img_size=img.size
##获得图片数据类型 
img.dtype

8、感兴趣区域ROI (region of interest)

##获得面部图像 
face= img[220:400, 250:350]
##粘贴脸部图像,可以跨图粘贴 
img[0:180, 0:100]=face

9、通道分解合并

##通道分解方案1 
b=img[:,:,0] 
g=img[:,:,1] 
r=img[:,:,2]
##通道分解方案2 
b,g,r=cv2.split(img)
##通道合并 
rgb=cv2.merge([r,g,b])
##只显示蓝色通道 
b=cv2.split(a)[0] 
g = np.zeros((rows,cols),dtype=a.dtype) 
r = np.zeros((rows,cols),dtype=a.dtype) 
m=cv2.merge([b,g,r])

10、图像加法

##超过255则为0 
result1= img1 + img2
##超过255则为255 
result2=cv2.add(img1, img2)
##图像带权重融合,第5个参数为偏移量 
result=cv2.addWeighted(img1,0.5,img2,0.5, 0)

11、图像类型转换

##彩色图转灰度图 
img2=cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
##BGR图转RGB图(重点:opencv的通道是 蓝、绿、红跟计算机常用的红、绿、蓝通道相反) 
img2=cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
##灰度图转BGR图,每个通道都是之前的灰度值 
img2=cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)

12、图像缩放 (宽、高)

##图片缩放->(200,100) 
img2=cv2.resize(img1, (200, 100))
##按比例缩放->(0.5,1.2) 
img2=cv2.resize(img1, (round(cols * 0.5), round(rows * 1.2)))
##按比例缩放,参数版 
img2=cv2.resize(img1, None, fx=1.2, fy=0.5)

13、图像翻转

img2=cv2.flip(img1, 0) #上下翻转 
img2=cv2.flip(img1, 1) #左右翻转 
img2=cv2.flip(img1, -1) #上下、左右翻转

14、图像移动、旋转、缩放

##图像移动=>(100,200) 
M = np.float32([[1, 0, 100], [0, 1, 200]]) 
b=cv2.warpAffine(img1, M, (height, width))
##图像中心、旋转45度、缩放0.6 M=cv2.getRotationMatrix2D((height/2,width/2),45,0.6) 
img2=cv2.warpAffine(img1, M, (height, width))
##图像菱形转换 
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]]) #左上角、右上角、左下角 
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]]) 
M=cv2.getAffineTransform(p1,p2) dst=cv2.warpAffine(img,M,(cols,rows))

15、图像阈值转换 、二值化

r,b=cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #图像二值化,阈值127,r为返回阈值,b为二值图 
r,b=cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) #图像反二值化 
r,b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO) #低于threshold则为0 
r,b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) #高于threshold则为0 
r,b=cv2.threshold(img,127,255,cv2.THRESH_TRUNC) #截断=>高于threshold则为threshold

16、图像平滑处理

##均值滤波 
img2=cv2.blur(img1, (5, 5))  #sum(square)/25
##normalize=1 均值滤波,normalize=0 区域内像素求和 
img1=cv2.boxFilter(img, -1, (2, 2), normalize=1)
##高斯滤波,第三个参数是方差,默认0计算公式: sigmaX=sigmaxY=0.3((ksize-1)*0.5-1)+0.8 (注:卷积核只能是奇数) 
img1=cv2.GaussianBlur(img, (3, 3), 0)  #距离像素中心点近的权重较大,以高斯方式往四周分布
##中值滤波,效果非常好?
img1=cv2.medianBlur(img,3)  #获得中心点附近像素排序后的中值

17、形态学操作

##图像腐蚀,k为全1卷积核 
k=np.ones((5,5),np.uint8) 
img1=cv2.erode(img, k, iterations=2)
##图像膨胀 
k=np.ones((5,5),np.uint8) 
img1=cv2.dilate(img, k, iterations=2)
##图像开运算 (先腐蚀后膨胀),去掉图形外侧噪点 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_OPEN, k, iterations=2)
##图像闭运算(先膨胀后腐蚀) ,去掉图形内侧噪点 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_CLOSE, k, iterations=2)
##图像梯度运算(膨胀-腐蚀) 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k)
##高帽运算 (原图-开运算),获得图形外噪点 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
##黑帽运算(闭运算-原图),获得图像内噪点 
k=np.ones((10,10),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)

18、图像梯度,边缘提取

##sobel梯度边缘提取,卷积核竖向[[-1,-2,-1][0,0,0][1,2,1]]  
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3) #横向边缘提取 
sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3) #竖向边缘提取 
sobelx = cv2.convertScaleAbs(sobelx) # 负值取正,图像展示只能有正值 
sobely = cv2.convertScaleAbs(sobely) 
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) #图像融合
##scharr梯度边缘提取,卷积核竖向[[-3,-10,-3][0,0,0][3,10,3]] ,scharr比sobel卷积核过滤出更多细节 
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0) 
scharry = cv2.Scharr(o,cv2.CV_64F,0,1) 
scharrx = cv2.convertScaleAbs(scharrx) # 负值取正 
scharry = cv2.convertScaleAbs(scharry) 
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) #图像融合
## 拉普拉斯梯度,边缘提取版本1 , 拉普拉斯图像梯度 [[0,1,0][1,-4,1][0,1,0] ] 
img1 = cv2.Laplacian(img, cv2.CV_64F) 
img1 = cv2.convertScaleAbs(img1)
##拉普拉斯梯度,边缘提取版本2,结果略有不同 
f=np.array([[0,1,0],[1,-4,1],[0,1,0]]) 
img1=cv2.filter2D(img, -1, f)

19、canny边缘检测

canny边缘检测理论

                                               sobel梯度大小:0.5|x|+0.5|y|

         高斯滤波                             梯度方向:arctan\(y/x\)                       同方向上保留最大梯度              

去噪------------------------->梯度------------------------------------->非极大值抑制---------------------------->

         跟高阈值连通的线会保留

滞后阈值--------------------->out
##canny边缘检测代码 
img1 = cv2.Canny(img,100,200) #参数:图片、低阈值、高阈值

20、图像金字塔

##图片向下采样,高斯滤波 1/2 删掉偶数列 
img1 = cv2.pyrDown(img)
##图片向上采样 ,面积*2 高斯滤波*4 ,下采样为不可逆运算 
img3=cv2.pyrUp(img2)
##计算拉普拉斯金字塔 
img1 = cv2.pyrDown(img) #下采样 
img2=cv2.pyrUp(img1) #上采样 
img3=img-img2

21、图像轮廓标注

gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度图转化 
dep,img_bin=cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY) #二值图转化 
image_,contours,hierarchy=cv2.findContours(img_bin, mode=cv2.RETR_TREE,  method=cv2.CHAIN_APPROX_SIMPLE) #获得图像轮廓 
to_write=img.copy() #原始图像copy,否则会在原图上绘制 
ret=cv2.drawContours(to_write,contours,-1,(0,0,255),2) #红笔绘制图像轮廓

22、直方图

##matplotlib 绘制直方图 
plt.hist(img.ravel(),256)
##用opencv计算直方图列表 
hist=cv2.calcHist(images= [img],channels=[0],mask=None,histSize=[256],ranges=[0,255])
##掩膜提取局部直方图 
pad=np.zeros(img.shape,np.uint8) 
pad[200:400,200:400]=255 hist_MASK=cv2.calcHist(images= [img],channels=[0],mask=pad,histSize=[256],ranges=[0,255])
##opencv 交、并、补、异或操作 
masked_img=cv2.bitwise_and(img,mask)

直方图均衡化原理

图像直方图->直方图归一化->累计直方图->*255 x坐标映射->对原来的像素值进行新像素值编码

##直方图均衡化调用 
img1=cv2.equalizeHist(img)
##matplotlib绘制图片前通道转换 
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #通道不一致性
##matplotlib多图绘制在一个面板上 
plt.subplot('221'),plt.imshow(img,cmap=plt.cm.gray),plt.axis('off'),plt.title('original') 
plt.subplot('222'), plt.imshow(img1, cmap=plt.cm.gray), plt.axis('off') 
plt.subplot('223'), plt.hist(img.ravel(),256) plt.subplot('224'), plt.hist(img1.ravel(), 256)

23、图像傅里叶变换(空间域=>频域)

##图像傅里叶变换 (转化为虚数,实部为幅度,虚部为频率) 
fft=np.fft.fft2(img) 
fft_center=np.fft.fftshift(fft) 
fft_flect=20*np.log(np.abs(fft_center))
##图像傅里叶逆变换 
fft_left=np.fft.ifftshift(fft_center) 
ifft=np.fft.ifft2(fft_left) 
img_f=np.abs(ifft)
##高通滤波 
h_c,w_c=round(h/2),round(w/2) 
fft_center[h_c-10:h_c+10,w_c-10:w_c+10]=0  #原图操作,低频信号归0
##opencv 傅里叶变换 
dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) 
fft_center=np.fft.fftshift(dft)
##opencv 低通滤波 
mask=np.zeros((h,w,2),dtype=np.uint8)    #定义掩膜 
h_c,w_c=round(h/2),round(w/2) R=20 
mask[h_c-R:h_c+R,w_c-R:w_c+R]=1 
dshift=fft_center*mask       #点乘,保留低频信号
##opencv 傅里叶反变换 
fft_left=np.fft.ifftshift(dshift) 
ifft=cv2.idft(fft_left) 
img_f=cv2.magnitude(ifft[:,:,0],ifft[:,:,1]) #Square(x*2+y*2)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 77,383评论 1 169
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 25,958评论 1 141
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 28,731评论 0 100
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 16,068评论 0 86
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 21,280评论 0 144
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 17,523评论 0 87
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 10,350评论 2 161
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 9,746评论 0 76
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 8,245评论 5 109
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 11,526评论 0 127
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 10,297评论 1 123
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 11,100评论 0 127
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 5,962评论 0 17
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 8,760评论 2 114
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 11,824评论 3 121
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 7,613评论 0 3
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 7,815评论 0 75
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 12,263评论 2 132
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 12,946评论 2 130

推荐阅读更多精彩内容