计算机视觉之图像处理--1

本文探讨了使用OpenCV和matplotlib库进行图像处理的方法,包括图片显示、角点检测及Harris角点算法的实现,旨在研究OpenCV在深度学习图像预处理中的应用。

前言

 深度学习中像是pytorch的transform的库中有许多对图像处理的操作,但功能好像有限,
 除此之外还有像是opencv,PIL等库也能对图像进行处理,
 本次打卡主要以python中的opencv来进行图像处理进行学习
 通过这次打卡学习来看一下opencv能否在深度学习的图像处理中发挥作用

基础铺垫

1. opencv结合matplotlib库进行图片显示

1.1 读取数据—在notebook中进行读取

import cv2 
import numpy as np
import matplotlib.pyplot as plt 
%matplotlib inline
cup1 = cv2.imread("lena.jpg",0)
cup2 = cv2.imread("lena.jpg",1)
cup3 = cv2.imread("lena.jpg",-1)
cup=[cup1,cup2,cup3]
# row , column =c[0].shape
print('row: %s ,column: %s'%(row,column))
for c in cup:
    plt.imshow(c)
    plt.show()
# cv2.imshow('cup2',cup2)
# cv2.imshow('cup3',cup3)
cv2.waitKey()
cv2.destroyAllWindows()

#保存图像
# cv2.imwrite("cup1.jpg", cup1)
# cv2.imwrite("cup2.jpg",cup2)
# cv2.imwrite("cup3.jpg",cup3)

lena1
lena2
lena3

2. 角点与梯度

具体参考这篇博客
用大白话来讲,图像梯度有很高的变化。这种变化是可以用来帮助检测角点的因为图片在某个方向上存在梯度,从而形成角点,为强调图像边缘作准备。

1.3 图像梯度
学过导数的人都知道导数的几何意义表示切线的斜率,这里用梯度的来表示图像边缘
梯度的基本原理可以参考这篇博客
下面就图像梯度给出相应的代码

import cv2 
import numpy as np
import matplotlib.pyplot as plt 
%matplotlib inline
cup=cv2.imread('lucky_boy.jpg',0)
row,column = cup.shape
print("row:%s,column:%s"%(row,column))
cup_f = np.copy(cup)
cup_f = cup_f.astype("float")
grad = np.zeros((row,column))
for x in range(2,row-1):
    for y in range(2,column-1):
        gx=abs(cup_f[x+1,y]-cup_f[x-1,y])
        gy=abs(cup_f[x,y+1]-cup_f[x-1,y])
        grad[x,y] = gx + gy
sharp =cup_f +grad
sharp= np.where(sharp<0, 0, np.where(sharp>255,255,sharp))
grad =grad.astype('uint8')
sharp =sharp.astype('uint8')
cup_all=[cup,grad,sharp]
for c in cup_all:
    plt.imshow(c)
    plt.show()
cv2.waitKey()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从第二张图片可以看出小男孩的边缘

3. Harrirs角点算法

参考这篇博客
需要用的泰勒二次展开式实对称矩阵对⻆化等数学知识
(从这里开始,数学很重要,留下了不学无术的泪水qwq)

3.1 Harrirs算法流程

  • 当局部窗口同时在水平和竖直方向上移动的时候,计算他们的变化量

具体计算方法的公式如下

在这里插入图片描述
然后用个泰勒二维展开在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 学完线性再回来看

    • 对于每一个窗口,都计算其中的一个相应函数R

    具体的计算

    • 在这里插入图片描述
    • 最后给定一定阈值threshold,比较R>threshold,得到的值表示为脚点

    ( 看了半天,还不是很懂,等数学基础补完后在回来看原理)

基于opencv(python版实现)

import cv2 as cv
import matplotlib.pyplot as plt 
import numpy as np
#检测参数
block_size = 3
sobel_size = 3
k = 0.06
image=cv.imread('lucky_boy.jpg')
height = image.shape[0]
width=image.shape[1]
channels =image.shape[2]
#print('width is %s ,height: %s ,channels:%s '%(width,height,channels))
gray_img =cv.cvtColor(image,cv.COLOR_BGR2GRAY)
gray_img=np.float32(gray_img)
corners_img=cv.cornerHarris(gray_img,block_size,sobel_size,k)
kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
dst=cv.dilate(corners_img,kernel)
for r in range(height):
   for c in range(width):
       pix = dst[r,c]
       if pix > 0.05 * dst.max():
           cv.circle(image,(c,r),5,(0,0,255),0)
image=cv.cvtColor(image,cv.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

原图片
小男孩1
小男孩

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值