一、概述
二、图像基础
三、 读取图像
#%% 图像基础
import numpy as np
import matplotlib.pyplot as plt
#构建一个数组
test = np.random.randint(0,255,size=(20,20,3))
plt.imshow(test)
#%%读写图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\lena.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_GRAYSCALE) #以灰度图像读取
'''
cv2.imread 无法识别带有 中文字符 的路径,因此需要用上述代码解决这个问题
'''
print(img.shape) #打印的结果是(height.width,channel)
#print(img.dtype) #打印img的数据类型
#图像展示
cv2.imshow(winname='lena',mat=img)
cv2.waitKey(100)
while True: #这是一个死循环,如果没有到达break,就会一直操作
cv2.imshow(winname='',mat=img)
key = cv2.waitKey(1)
if key == ord('m'): #返回m的二进制
print('不操作')
if key == ord('n'): #返回m的二进制
print('不操作')
if key == ord('q'): #返回m的二进制
print('退出')
break
#保存图像,注意:无法保存到带有中文字符的路径下
#cv2.imwrite(filename=r'D:\lena_test.jpg',img=img)
四、几何变换-图像的平移和旋转
#%% 几何变换-图像的平移和旋转
import cv2
import numpy as np
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\lena.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
height, width, channel = img.shape
#平移
#1.定义定义矩阵
M = np.float32([[1,0,-50],[0,1,-100]])
#2.执行变换
img_add = cv2.warpAffine(src=img,M=M,dsize=(height,width))
cv2.imshow('',mat=img_add)
cv2.waitKey(0)
#旋转
#1. 定义旋转(rotation)矩阵
M = cv2.getRotationMatrix2D(center=(height*0.5,width*0.5),#旋转的中心位置
angle=45,#旋转的角度
scale=0.8,#缩放比例
)
#2.执行转换
img_rotation = cv2.warpAffine(src=img,M=M,dsize=(height,width))
cv2.imshow('',mat=img_rotation)
cv2.waitKey(0)
五、几何变换-最近邻插值
#%%几何变换-最近邻插值(图像缩放)
import cv2
import numpy as np
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\lena.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
height, width, channel = img.shape
#图像缩放
#1.直接指定大小,VGG--244*244 在VGG模型中,指定的图片大小为244*244
img_res = cv2.resize(src=img,dsize=(244,244))
print(img_res.shape)
cv2.imshow('',mat=img_res)
cv2.waitKey(0)
#2.最近邻插值
img_near = cv2.resize(src=img,dsize=None,fx=0.5,fy=1,
interpolation=cv2.INTER_NEAREST #指定插值方式-可修改的地方
)
print(img_near.shape)
cv2.imshow('',mat=img_near)
cv2.waitKey(0)
六、灰度处理
1.线性变换![](https://img-blog.csdnimg.cn/7bbc0c36393e4e1ab34a762975f6c59d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQzOTAxMjYw,size_20,color_FFFFFF,t_70,g_se,x_16)
#%%灰度处理
#1.线性变换
import cv2
import numpy as np
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\outdoor.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
cv2.imshow('',img)
cv2.waitKey(0)
#变换:y=2.5x + 10
dat = 2.5 * img + 100
dat[dat>255] = 255 #截断,把大于255的像素值变为255
dat = np.asarray(dat,np.uint8) #像素值变为整数
cv2.imshow('',dat)
cv2.waitKey(0)
2、对数变换
#2.非线性变换-对数变换
import cv2
import numpy as np
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\outdoor.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
cv2.imshow('',img)
cv2.waitKey(0)
#变换:logdat = a + c*np.log(img + 1)
logdat = 30 + 30*np.log(img + 1)
logdat[logdat>255] = 255 #截断,把大于255的像素值变为255
logdat = np.asarray(logdat,np.uint8) #像素值变为整数
cv2.imshow('',logdat)
cv2.waitKey(0)
3、指数变换
#3.指数变换
import cv2
import numpy as np
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\outdoor.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
cv2.imshow('',img)
cv2.waitKey(0)
#变换:gammadat = c*np.power(img,a) --指数的形式
gammadat = 10*np.power(img,1.1)
gammadat[gammadat>255] = 255 #截断,把大于255的像素值变为255
gammadat = np.asarray(gammadat,np.uint8) #像素值变为整数
cv2.imshow('',gammadat)
cv2.waitKey(0)
4. 直方图处理
注意:只能对单通道均衡化,均衡化能够提升图片质量
#%% 直方图均衡化 均衡化可以提升图片质量
#对单通道图均衡化
import cv2
import numpy as np
import matplotlib.pyplot as plt
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\outdoor.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
plt.hist(img.ravel(),256,[0,255]) #绘制灰度直方图
#均衡化 #只能对单通道的图均衡化
#print(img.shape) #(381, 500, 3) 这个图片是个三通道的
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度图像
#print(gray.shape)
hist = cv2.equalizeHist(gray)
cv2.imshow('hist',hist)
cv2.imshow('gray',gray)
cv2.waitKey(0)
#对彩色图像均衡化
def EqualizeHise(img):
#1.拆分通道
(b,g,r) = cv2.split(img)
#2.对每个通道进行均衡化
bh = cv2.equalizeHist(b)
gh = cv2.equalizeHist(g)
rh = cv2.equalizeHist(r)
#3.合并
result = cv2.merge((bh,gh,rh))
return result
equal = EqualizeHise(img)
cv2.imshow('equal',equal)
cv2.imshow('img',img)
cv2.waitKey(0)
plt.hist(equal.ravel(),256,[0,255])
5.图像二值化
#%%图像二值化
import cv2
import numpy as np
import matplotlib.pyplot as plt
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\lena.jpg'
img=cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
#1.阈值截断--针对单通道
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度图像
x,thres = cv2.threshold(src=gray,thresh=120,maxval=255,type=cv2.THRESH_BINARY)
#会返回两个结果
#x:阈值 thres:数组
cv2.imshow('thres',thres)
cv2.waitKey(0)
#自适应阈值
thres2 = cv2.adaptiveThreshold(src = gray,
maxValue=255,
adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
thresholdType=cv2.THRESH_BINARY,
blockSize=7, #blocksize 越大,值保留的信息越多
C=10) #C越大,噪声会越小
cv2.imshow('thres2',thres2)
cv2.waitKey(0)
七、图像处理:其他算法变换
7.1 图像平滑
7.1.1 均值滤波
7.1.2 中值滤波![](https://img-blog.csdnimg.cn/966f908ab1b347a68a07c83ed5bff9dd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQzOTAxMjYw,size_20,color_FFFFFF,t_70,g_se,x_16)
7.1.3 高斯滤波
#%%图像平滑
import cv2
import numpy as np
import matplotlib.pyplot as plt
#1.均值滤波
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\lena1.jpg'
lena = cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
lena_mean = cv2.blur(src=lena,ksize=(3,3))
cv2.imshow('lena_mean',lena_mean)
cv2.imshow('lena',lena)
cv2.waitKey(0)
#2.中值滤波-可以去噪,并且不会变的模糊
lena_median = cv2.medianBlur(src=lena,ksize=3)
cv2.imshow('lena_median',lena_median)
cv2.imshow('lena',lena)
cv2.waitKey(0)
#3.高斯滤波-通过修改参数,来看效果
lena_Gaussi = cv2.GaussianBlur(src=lena, ksize=(3,5), sigmaX=1.2,sigmaY=0)
cv2.imshow('lena_Gaussi',lena_Gaussi)
cv2.imshow('lena',lena)
cv2.waitKey(0)
7.2 图像锐化-Sobel算子
7.2.1 Sobel算子
#%%图像锐化
import cv2
import numpy as np
import matplotlib.pyplot as plt
pic_path = r'D:\上课文件\python\泰迪杯\计算机视觉\OpenCV图像处理\data\lena1.jpg'
lena = cv2.imdecode(np.fromfile(pic_path,dtype=np.uint8),cv2.IMREAD_ANYCOLOR) #以灰度图像读取
#Sobel算子
#1.计算X方向的偏导
sobelx = cv2.Sobel(src=lena, ddepth=cv2.CV_64F, dx=1, dy=0,
ksize=3,
scale=1.2,
delta=20)
#2.计算Y方向上的偏导
sobely = cv2.Sobel(src=lena, ddepth=cv2.CV_64F, dx=0, dy=1,
ksize=3,
scale=1.2,
delta=20)
#3.合并两个方向的结果
sobelx = cv2.convertScaleAbs(sobelx)#防止计算结果有负值,取绝对值
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.8,sobely,0.5,gamma=0)
#0.8x + 0.5y + 0
cv2.imshow('sobelx',sobelx)
cv2.imshow('sobely',sobely)
cv2.imshow('sobelxy',sobelxy)
cv2.imshow('lena',lena)
cv2.waitKey(0)
7.3 图像锐化-其他算子