图像是由像素pixel构成。并且通常包括二值图像、灰度图像、彩色图像。
二值图像的任何一个点像素,非黑即白。
灰度图像,除了黑和白,还包括了灰色,并且把灰色划分为256个不同的等级。
彩色图像(RGB图像),每个像素点有三个值构成(R,G,B),分别表示红绿蓝的颜色等级。
安装模块 pip install open-python
读取图片的代码如下:
# code
import cv2
img = cv2.imread('test.jpg')
cv2.imshow('demo', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
将x轴100:200,y轴100:200的矩形设置为 白色(255,255,255)
import cv2
img=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
img[100:200,100:200]=[255,255,255]
cv2.imshow('demo', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
print(img.shape) # 按原通道读入,不写的话默认读入三通道图片
print(img.size) # 获取像素信息
import numpy as np
import cv2
img=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
face=np.ones((200,100,3))
face=img[200:400,200:400] # 指定区域
cv2.imshow('face',face)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图像融合
import numpy as np
import cv2
img=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
test=cv2.imread('test2.jpg',cv2.IMREAD_UNCHANGED)
face=np.ones((200,100,3))
face=img[50:275,70:300] # 原图的截取面
test[70:295,70:300]=face # 覆盖在图2的位置
cv2.imshow('pic',test)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图像的通道处理, 拆分图像3原色
import cv2
test=cv2.imread('test2.jpg',cv2.IMREAD_UNCHANGED)
b,g,r=cv2.split(test)
cv2.imshow('B',b)
cv2.imshow('G',g)
cv2.imshow('R',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 融合图像 3原色
import cv2
test=cv2.imread('test2.jpg',cv2.IMREAD_UNCHANGED)
b,g,r=cv2.split(test)
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 提取图片的不同颜色
import cv2
import numpy as np
test=cv2.imread('test2.jpg',cv2.IMREAD_UNCHANGED)
rows,clos,chn=test.shape
b=cv2.split(test)[0] # 提取蓝色通道 (提取其他也一样)
g=np.zeros((rows,clos),dtype=test.dtype)
r=np.zeros((rows,clos),dtype=test.dtype)
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
test=cv2.imread('test2.jpg',cv2.IMREAD_UNCHANGED)
img=test
rest=img+test
rest2=cv2.add(img,test)
cv2.imshow("test",test)
cv2.imshow("rest",rest)
cv2.imshow("rest2",rest2)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图像的类型转换 GRAY ,RGB,
import cv2
test=cv2.imread('test2.jpg')
result=cv2.cvtColor(test,cv2.COLOR_BGR2GRAY)
result2=cv2.cvtColor(test,cv2.COLOR_BGR2RGB)
# result3=cv2.cvtColor(test,cv2.COLOR_GRAY2BGR)
cv2.imshow("test",test)
cv2.imshow("result",result)
cv2.imshow("result2",result2)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过像素缩放
# 图像的缩放
import cv2
test=cv2.imread('test2.jpg')
result=cv2.resize(img,(200,200)) # 通过像素缩放
print(result.shape)
cv2.imshow("test",test)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyAllWindows()
利用缩放系数进行缩放
# 利用缩放系数进行缩放
import cv2
test=cv2.imread('test2.jpg')
rows,cols=img.shape[:2]
result=cv2.resize(img,None,fx=0.3,fy=0.3)
cv2.imshow("test",test)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图像的旋转
import cv2
test=cv2.imread('test2.jpg')
rows,cols=img.shape[:2]
M=cv2.getRotationMatrix2D((cols/2,rows/2),30,1) #旋转中心 旋转度数 scale
rote=cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("img",img)
cv2.imshow("result",rote)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图像的噪声
import cv2
import numpy as np
img=cv2.imread('test2.jpg',cv2.IMREAD_UNCHANGED)
rows,cols,chn=img.shape
for i in range(6000):
x=np.random.randint(0,rows)
y=np.random.randint(0,cols)
img[x,y,:]=255
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
均值滤波(滤波是用来处理噪声的)
# 滤波 均值滤波 指任意一点的像素值 都是周围n*m个像素的平均值
import cv2
import matplotlib.pylab as plt
test=cv2.imread('zao.jpg')
source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
result=cv2.blur(source,(5,5)) # 均值滤波
title=['source Image','Blur Image']
images=[source,result]
for i in range(2):
plt.subplot(1,2,i+1)
plt.imshow(images[i],'gray')
plt.title(title[i])
plt.xticks([])
plt.yticks([])
plt.show()
高斯滤波
'''
高斯滤波 将领域的平均思想对图像进行平滑的一种方法,
在对图像进行平均是不同位置的像素被赋予了不同的权重
'''
import cv2
import matplotlib.pylab as plt
test=cv2.imread('zao.jpg')
source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
result=cv2.GaussianBlur(source,(3,3),0) # 高斯滤波
title=['source Image','gaos Image']
images=[source,result]
for i in range(2):
plt.subplot(1,2,i+1)
plt.imshow(images[i],'gray')
plt.title(title[i])
plt.xticks([])
plt.yticks([])
plt.show()
中值滤波
'''
中值滤波
使用领域平均法 会使边界变得模糊起来
中值滤波用的是非线性的图像处理办法
去噪的同时兼顾到了边界信息的保留 选择一个奇数点的窗口w 将这个窗口在图像上
进行扫描 然后按照灰度级进行排序 取中间灰度值代替该点的灰度值
'''
import cv2
test=cv2.imread('zao.jpg')
result=cv2.medianBlur(img,3)
cv2.imshow("img",img)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图像处理的傅里叶变换
import matplotlib.pylab as plt
img = cv2.imread('test.jpg')
# 快速傅里叶变换
f = np.fft.fft2(img)
# 默认中心点的位置为左上角
fshift = np.fft.fftshift(f)
fimg = np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(img,'gray'),plt.title('orginal')
plt.axis('off')
plt.subplot(122),plt.imshow(fimg,'gray'),plt.title('fimage')
plt.axis('off')
plt.show()
显示灰度
# 图像处理的傅里叶变换
import matplotlib.pylab as plt
img = cv2.imread('test.jpg',0) # 显示灰度图
# 快速傅里叶变换
f = np.fft.fft2(img)
# 默认中心点的位置为左上角
fshift = np.fft.fftshift(f)
fimg = np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(img,'gray'),plt.title('orginal')
plt.axis('off')
plt.subplot(122),plt.imshow(fimg,'gray'),plt.title('fimage')
plt.axis('off')
plt.show()
傅里叶的逆变换
import matplotlib.pylab as plt
img = cv2.imread('test.jpg',0) # 显示灰度图
# 快速傅里叶变换
f = np.fft.fft2(img)
# 默认中心点的位置为左上角
fshift = np.fft.fftshift(f)
fimg = np.log(np.abs(fshift))
# 傅里叶的逆变换
ishift = np.fft.ifftshift(fshift)
iimage = np.fft.ifft2(ishift)
iimage = np.abs(iimage)
plt.subplot(131),plt.imshow(img,'gray'),plt.title('orginal')
plt.axis('off')
plt.subplot(132),plt.imshow(fimg,'gray'),plt.title('res')
plt.axis('off')
plt.subplot(133),plt.imshow(iimage,'gray'),plt.title('res2')
plt.axis('off')
plt.show()