03Roberts算子


前言

记录学习锐化算子的代码和思路。使用的图像为lena小姐姐。


一、单方向上的锐化

由于图像我们可以认为由垂直和水平两个方向组成,因此,单方向上的锐化也考虑水平锐化和垂直锐化。
选择水平和垂直锐化模板为H1,H2。

import cv2
import numpy as np

import img_filter2D #我自己写的卷积求和函数,可以使用第三库函数代替

img = cv2.imread("lena.bmp",0)
H1 = np.array([[1,2,1],[0,0,0],[-1,-2,-1]])
H2 = np.array([[1,0,-1],[2,0,-2],[1,0,-1]])

new_img1 = img_filter2D.my_filter2D(img,H1)
new_img2 = img_filter2D.my_filter2D(img,H2)

cv2.imshow("Horizontal",new_img1)
cv2.imshow("Vertical",new_img2)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果图如下。
在这里插入图片描述

由于我们使用的模板有负数的存在,因此,有可能会在某些区域产生负的像素值的现象。
解决这个主要有两个思路:
1.每个像素位置都+一个常数,最后将像素的范围限制在0-255,但这种处理方式会出现“浮雕”现象
2.取绝对值。其实是对边缘有方向的提取。
效果图如下:
在这里插入图片描述
在这里插入图片描述

二、无方向上的锐化

1.Roberts算子

Roberts算子是一种常用的边缘检测算子,它是由Lawrence Roberts于1963年提出的。它主要是用于图像中的边缘检测,可以对图像进行快速检测,检测到的边缘效果较为明显。

Roberts算子是一种基于差分的算子,其主要思想是通过对像素点之间的差分来检测图像中的边缘。Roberts算子将每个像素与其右下方的像素进行差分运算,然后将两个差值取绝对值的和作为该像素的边缘强度值。因此,Roberts算子在计算边缘时只考虑了左上到右下左下到右上两个方向。

Roberts算子的计算公式如下:

Gx = |img(x+1, y+1) - img(x, y)|
Gy = |img(x, y+1) - img(x+1, y)|
G(x, y) = Gx + Gy
其中,Gx和Gy分别表示在水平和垂直方向上的差分值,G(x, y)表示该像素的边缘强度值。
代码如下(示例):

import cv2

# 读入图像
img = cv2.imread('image.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Roberts算子进行边缘检测
edges = cv2.roberts(gray)
# 显示并保存边缘检测结果
cv2.imshow('Edges (Roberts)', edges)
cv2.waitKey(0)
cv2.imwrite('edges_roberts.jpg', edges)

自己写的roberts函数如下:

def my_roberts(img):
    h,w = img.shape[:2]
    G = np.zeros((img.shape[0],img.shape[1]),dtype=np.float32)
    for i in range(h-1):
        for j in range(w-1):
            Gx = abs(img[i+1][j+1]-img[i][j])
            Gy = abs(img[i+1][j]-img[i][j+1])
            G[i][j] = Gx+Gy
    new_img = np.clip(G, 0, 255).astype(np.uint8)
    return new_img

问题:一直报这个错误,但是我没想明白为什么会溢出。

C:\Users\14605\Desktop\co\Roberts.py:14: RuntimeWarning: overflow encountered in ubyte_scalars
  Gx = abs(img[i+1][j+1]-img[i][j])
C:\Users\14605\Desktop\co\Roberts.py:15: RuntimeWarning: overflow encountered in ubyte_scalars
  Gy = abs(img[i+1][j]-img[i][j+1])
C:\Users\14605\Desktop\co\Roberts.py:16: RuntimeWarning: overflow encountered in ubyte_scalars
  G[i][j] = Gx+Gy

结果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_Yangk/article/details/129815180