Python-OpenCV 图像基本操作

版权声明:转载请说明来源,谢谢 https://blog.csdn.net/wsp_1138886114/article/details/82763990

一、图片 读、写、显示、属性查看

import numpy as np
import cv2

-----------------------------直接读取--------------------------------
img = cv2.imread('cat.jpg',0)   #读取图像(直接读取)
cv2.imshow('image',img)         #显示图像
k = cv2.waitKey(0)
if k == 27:                     # 按 Esc 退出(关闭显示窗口)
    cv2.destroyAllWindows()
elif k == ord('s'):             # 按 's' 保存并退出 (关闭显示窗口)
    cv2.imwrite('cat01.png',img)
    cv2.destroyAllWindows() 

-----------------------------以灰度图的形式读取--------------------------------
grayImage = cv2.imread('cat.png', cv2.IMREAD_GRAYSCALE )
"""
也可选参数:
		cv2.IMREAD_COLOR     (BGR,忽略alpha通道), 
		cv2.IMREAD_GRAYSCALE (grayscale:读入灰度图片), 
		cv2.IMREAD_UNCHANGED (完整图片,包括alpha通道)
"""
cv2.imwrite('cat02.png', grayImage) 

-----------------------------图片的属性--------------------------------
print ("图片形状:",img.shape)(长、宽、通道数)
print ("图片大小:",img.size)
print ("图片类型:",img.dtype)
"""
输出:
	图片形状: (366, 445, 3)
	图片大小: 488610
	图片类型: uint8
"""

在这里插入图片描述

二、图像增强(缩放、平移、旋转)

import cv2
import numpy as np

-----------------------------图像缩放--------------------------------
"""
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)  
	scr:   原图
	dsize:输出图像尺寸
	fx:    沿水平轴的比例因子
	fy:    沿垂直轴的比例因子
	interpolation:插值方法(见附录)
""" 
# 方法1:直接设定缩放因子
img = cv2.imread('005.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

print(img.shape)         #输出为(366,445,3)【宽:x轴,高:y轴,通道数】
print(img.shape[:2])     #输出为(366,445)
cv2.imshow('', res1)
cv2.waitKey(0)
cv2.destroyAllWindows() 

#方法2:获取原图像的水平方向尺寸和垂直方向尺寸。再缩放
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

-----------------------------图像平移--------------------------------
img = cv2.imread('005.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() 

-----------------------------图像旋转--------------------------------
img = cv2.imread('005.jpg',0)
rows,cols = img.shape
 
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

三、仿射变换(图像位置校正)

import cv2
import numpy as np
 
img = cv2.imread('006.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)

四、颜色变换

"""
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()                           # 读取视频的每一帧
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)    # 将图片颜色空间从 BGR -> HSV 空间

    lower_blue = np.array([110,50,50])              # 定义在HSV空间中蓝色的范围
    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()

五、通道的拆分/合并处理/添加边距

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


-----------------------------添加边距--------------------------------
"""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)

附录:

interpolation   所用的插值方法

	INTER_NEAREST 	最近邻插值
	INTER_LINEAR 	双线性插值(默认设置)
	INTER_AREA 	使用像素区域关系进行重采样。  
	                它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 
	                但是当图像缩放时,它类似于INTER_NEAREST方法。
	                
	INTER_CUBIC 	4x4像素邻域的双三次插值
	INTER_LANCZOS4 	8x8像素邻域的Lanczos插值 

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/82763990