计算机视觉

一、概述

 

二、图像基础

 

 

 

 

三、 读取图像

 

#%% 图像基础
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.线性变换

 

 

 

#%%灰度处理
#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 中值滤波

 ​​

 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 图像锐化-其他算子

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值