设为首页 收藏本站
查看: 2981|回复: 0

[经验分享] python 简单图像处理(11) 空间域图像锐化(边缘检测)

[复制链接]

尚未签到

发表于 2015-4-28 07:08:46 | 显示全部楼层 |阅读模式
  这真是一件悲剧的事,早上,我花了很长时间写了这篇文章
  当我快要完成时,然后电脑就蓝屏了,重启后,一切都成了浮云
  好啦,没耐心再写那么多了,尽量简单吧
  
  在图像识别中,需要有边缘鲜明的图像,即图像锐化。
  图象锐化的目的是为了突出图像的边缘信息,加强图像的轮廓特征,以便于人眼的观察和机器的识别。
  在空间域进行图象锐化主要有以下方法


  • 梯度算子
  • 其他锐化算子
  • 拉普拉斯算子
  (1)梯度空间算子
  图像的边缘最直观的表现就是边缘两侧的灰度值相差比较大,在微积分中我们学过梯度的概念
  梯度是一个列向量,可表示为:
DSC0000.png
  而某点处梯度的模很好的反应了该点两侧的变化大小
  所以,梯度值很大的点也就代表了图像的边缘
  而在实际计算中,为了降低运算量,一般用一下两种方法来代替模运算
DSC0001.png
  由于数字图像处理中处理的是数字离散信号
  所以,我们用差分来等同于连续信号中的微分运算
  典型的梯度运算有
DSC0002.png
  而另一种称为Roberts梯度的差分运算可由下来表示
DSC0003.png
  
  我们来编写程序来实现上面计算
  



import cv
def Sharp(image,flag1=0,flag2=0):
    w = image.width
    h = image.height
    size = (w,h)
    iSharp = cv.CreateImage(size,8,1)
    for i in range(h-1):
        for j in range(w-1):
            if flag2 == 0:
                x = abs(image[i,j+1]-image[i,j])
                y = abs(image[i+1,j]-image[i,j])
            else:
                x = abs(image[i+1,j+1]-image[i,j])
                y = abs(image[i+1,j]-image[i,j+1])
            if flag1 == 0:
                iSharp[i,j] = max(x,y)
            else:
                iSharp[i,j] = x+y
    return iSharp


image = cv.LoadImage('lena.jpg',0)
iMaxSharp = Sharp(image)
iAddSharp = Sharp(image,1)
iRMaxSharp = Sharp(image,0,1)
iRAddSharp = Sharp(image,1,1)
cv.ShowImage('iMaxSharp',iMaxSharp)
cv.ShowImage('image',image)
cv.ShowImage('iAddSharp',iAddSharp)
cv.ShowImage('iRAddSharp',iRAddSharp)
cv.ShowImage('iRMaxSharp',iRMaxSharp)
cv.WaitKey(0)
我们来看看运行结果
DSC0004.jpg
  下面是Roberts梯度
  可以比较下两种方法的效果
  
  (2)其他锐化算子
  利用梯度和差分原理可以组成以下锐化算子
  1.Sobel算子
DSC0005.png
  2.Prewitt算子
DSC0006.png
  3.Isotropic算子
DSC0007.png
  好啦,我们还是写程序吧
  




import cv
def SuanSharp(image,arrayX,arrayY):
    w = image.width
    h = image.height
    size = (w,h)
    iSuanSharp = cv.CreateImage(size,8,1)
    tmpX = [0]*9
    tmpY = [0]*9
    for i in range(1,h-1):
        for j in range(1,w-1):
            for k in range(3):
                for l in range(3):
                    tmpX[k*3+l] = image[i-1+k,j-1+l]*arrayX[k*3+l]
                    tmpX[k*3+l] = image[i-1+k,j-1+l]*arrayX[k*3+l]
            iSuanSharp[i,j] = sum(tmpX)+sum(tmpY)
    return iSuanSharp
image = cv.LoadImage('lena.jpg',0)
SobelX = [1,0,-1,2,0,-2,1,0,-1]
SobelY = [-1,-2,-1,0,0,0,1,2,1]
PrewittX = [1,0,-1,1,0,-1,1,0,-1]
PrewittY = [-1,-1,-1,0,0,0,1,1,1]
IsotropicX = [1,0,-1,1.414,0,-1.414,1,0,-1]
IsotropicY = [-1,-1.414,-1,0,0,0,1,1.414,1]
iSobelSharp = SuanSharp(image,SobelX,SobelY)
iPrewittSharp = SuanSharp(image,PrewittX,PrewittY)
iIsotropicSharp = SuanSharp(image,IsotropicX,IsotropicY)
cv.ShowImage('image',image)
cv.ShowImage('iPrewittSharp',iPrewittSharp)
cv.ShowImage('iSobelSharp',iSobelSharp)
cv.ShowImage('iIsotropicSharp',iIsotropicSharp)
cv.WaitKey(0)
  
  看看运行效果吧
DSC0008.jpg
  
  好吧,这三个图的运算花了好几秒的时间,循环太多了,其实可以用numpy做矩阵运算
  我们在这里主要学习图像处理原理,不是学习编程
  
  (3)拉普拉斯运算
  拉普拉斯运算比较适合于改善因为光线的漫反射而造成的图像模糊,拉普拉斯算子法是常用的边缘增强处理算子
  它是各向同性的二阶导数
  对于连续二元函数有:
DSC0009.png
  整理后有:
DSC00010.png
  可以得到拉普拉斯算子模板:
DSC00011.png
  看看运行效果
DSC00012.jpg
  而对于Photoshop这类软件来说,锐化和我这里所说的锐化不同
  它是在原图基础上,加强边缘效果
  我们只要把模板适当改动就能实现这样的效果
DSC00013.png
DSC00014.jpg
  
  还有一种思路,我们在前面讲了图像的平滑,我们用原图减去平滑后的图像
  得到的就是锐化边缘了
DSC00015.jpg
  第四幅图我们对轮廓线做了对数灰度变换,前面讲过的
  不过,效果没有前面直接锐化清晰
  我们还可以在原图上乘以一个大于1的因子再减去模糊后的图像
  得到如下结果
DSC00016.jpg
  
  好啦,图像空域的锐化处理就讲到这里啦,是不是很简单呢?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61311-1-1.html 上篇帖子: Centos5+python+pyodbc+freetds+unixODBC+sql server 下篇帖子: Python 初体验(四)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表