当前位置:   article > 正文

【图像处理】python实现图像锐化边缘检测算子(Robert、Sobel、Prewitt、Laplacian算子)_编写实现图像锐化的函数,可设置robert、sebel、laplace算子,对图 像进行锐化处理

编写实现图像锐化的函数,可设置robert、sebel、laplace算子,对图 像进行锐化处理

一、Robert算子

罗伯特梯度法(Robert Gradient), 是一种交叉差分方法。其数学表达式可近似为:

G[f(x, y)] ≈|f(i, j)-f(i+1, j+1) |+|f(i+1, j)-f(i, j+1)|

  1. ################################################
  2. # Robert算子
  3. ################################################
  4. def robert_filter(image):
  5. h = image.shape[0]
  6. w = image.shape[1]
  7. image_new = np.zeros(image.shape, np.uint8)
  8. for i in range(1, h-1):
  9. for j in range(1, w-1):
  10. image_new[i][j] = np.abs((image[i][j]-image[i+1][j+1])) + np.abs(image[i+1][j]-image[i][j+1])
  11. return image_new

二、Sobel算子

采用梯度微分锐化图像,同时会使噪声、条纹等得到增强, Sobel算子则在一定程度上克服了这个问题。Sobel算子法的基本原理是:计算3×3窗口的灰度, 将其作为变换后图像g(i, j)的灰度。公式如下:

  1. ################################################
  2. # Sobel算子
  3. ################################################
  4. def sobel_filter(image):
  5. h = image.shape[0]
  6. w = image.shape[1]
  7. image_new = np.zeros(image.shape, np.uint8)
  8. for i in range(1, h-1):
  9. for j in range(1, w-1):
  10. sx = (image[i + 1][j - 1] + 2 * image[i + 1][j] + image[i + 1][j + 1]) - \
  11. (image[i - 1][j - 1] + 2 * image[i - 1][j] + image[i - 1][j + 1])
  12. sy = (image[i - 1][j + 1] + 2 * image[i][j + 1] + image[i + 1][j + 1]) - \
  13. (image[i - 1][j - 1] + 2 * image[i][j - 1] + image[i + 1][j - 1])
  14. image_new[i][j] = np.sqrt(np.square(sx) + np.square(sy))
  15. return image_new

三、Prewitt算子

与Sobel相比,Prewitt算子有一定的抗干扰性,图像效果比较干净。

公式如下:

  1. ################################################
  2. # Prewitt算子
  3. ################################################
  4. def prewitt_filter(image):
  5. h = image.shape[0]
  6. w = image.shape[1]
  7. image_new = np.zeros(image.shape, np.uint8)
  8. for i in range(1, h-1):
  9. for j in range(1, w-1):
  10. sx = (image[i - 1][j - 1] + image[i - 1][j] + image[i - 1][j + 1]) - \
  11. (image[i + 1][j - 1] + image[i + 1][j] + image[i + 1][j + 1])
  12. sy = (image[i - 1][j - 1] + image[i][j - 1] + image[i + 1][j - 1]) - \
  13. (image[i - 1][j + 1] + image[i][j + 1] + image[i + 1][j + 1])
  14. image_new[i][j] = np.sqrt(np.square(sx) + np.square(sy))
  15. return image_new

四、Laplacian算子

拉普拉斯运算是偏导数运算的线性组合运算,属于二阶微分运算。与以上三类一阶微分运算相比,Laplacian算子获得的边界更为细致,包含了更多信息,

公式如下:

 

  1. ################################################
  2. # Laplacian算子
  3. ################################################
  4. def laplacian_filter(image):
  5. h = image.shape[0]
  6. w = image.shape[1]
  7. image_new = np.zeros(image.shape, np.uint8)
  8. for i in range(1, h-1):
  9. for j in range(1, w-1):
  10. image_new[i][j] = image[i + 1][j] + image[i - 1][j] + image[i][j + 1] + image[i][j - 1] - 8 * image[i][j]
  11. return image_new

五、完整代码

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import random
  4. ################################################
  5. # Robert算子
  6. ################################################
  7. def robert_filter(image):
  8. h = image.shape[0]
  9. w = image.shape[1]
  10. image_new = np.zeros(image.shape, np.uint8)
  11. for i in range(1, h-1):
  12. for j in range(1, w-1):
  13. image_new[i][j] = np.abs((image[i][j]-image[i+1][j+1])) + np.abs(image[i+1][j]-image[i][j+1])
  14. return image_new
  15. ################################################
  16. # Sobel算子
  17. ################################################
  18. def sobel_filter(image):
  19. h = image.shape[0]
  20. w = image.shape[1]
  21. image_new = np.zeros(image.shape, np.uint8)
  22. for i in range(1, h-1):
  23. for j in range(1, w-1):
  24. sx = (image[i + 1][j - 1] + 2 * image[i + 1][j] + image[i + 1][j + 1]) - \
  25. (image[i - 1][j - 1] + 2 * image[i - 1][j] + image[i - 1][j + 1])
  26. sy = (image[i - 1][j + 1] + 2 * image[i][j + 1] + image[i + 1][j + 1]) - \
  27. (image[i - 1][j - 1] + 2 * image[i][j - 1] + image[i + 1][j - 1])
  28. image_new[i][j] = np.sqrt(np.square(sx) + np.square(sy))
  29. return image_new
  30. ################################################
  31. # Prewitt算子
  32. ################################################
  33. def prewitt_filter(image):
  34. h = image.shape[0]
  35. w = image.shape[1]
  36. image_new = np.zeros(image.shape, np.uint8)
  37. for i in range(1, h-1):
  38. for j in range(1, w-1):
  39. sx = (image[i - 1][j - 1] + image[i - 1][j] + image[i - 1][j + 1]) - \
  40. (image[i + 1][j - 1] + image[i + 1][j] + image[i + 1][j + 1])
  41. sy = (image[i - 1][j - 1] + image[i][j - 1] + image[i + 1][j - 1]) - \
  42. (image[i - 1][j + 1] + image[i][j + 1] + image[i + 1][j + 1])
  43. image_new[i][j] = np.sqrt(np.square(sx) + np.square(sy))
  44. return image_new
  45. ################################################
  46. # Laplacian算子
  47. ################################################
  48. def laplacian_filter(image):
  49. h = image.shape[0]
  50. w = image.shape[1]
  51. image_new = np.zeros(image.shape, np.uint8)
  52. for i in range(1, h-1):
  53. for j in range(1, w-1):
  54. image_new[i][j] = image[i + 1][j] + image[i - 1][j] + image[i][j + 1] + image[i][j - 1] - 8 * image[i][j]
  55. return image_new
  56. #############################################################################
  57. if __name__ == "__main__":
  58. img = plt.imread("1.jpg")
  59. rgb_weight = [0.299, 0.587, 0.114]
  60. img_gray = np.dot(img, rgb_weight)
  61. ################################################
  62. # 原图
  63. ################################################
  64. plt.subplot(241)
  65. plt.imshow(img)
  66. plt.xticks([])
  67. plt.yticks([])
  68. plt.title("Original")
  69. ################################################
  70. # 灰度图
  71. ################################################
  72. plt.subplot(242)
  73. plt.imshow(img_gray, cmap=plt.cm.gray)
  74. plt.xticks([])
  75. plt.yticks([])
  76. plt.title("Gray")
  77. ################################################
  78. # Robert算子
  79. ################################################
  80. img_Robert = robert_filter(img_gray)
  81. img_Robert = img_Robert.astype(np.float64)
  82. plt.subplot(245)
  83. plt.imshow(img_Robert, cmap=plt.cm.gray)
  84. plt.xticks([])
  85. plt.yticks([])
  86. plt.title("robert_filter")
  87. ################################################
  88. # Sobel算子
  89. ################################################
  90. img_Sobel = sobel_filter(img_gray)
  91. img_Sobel = img_Sobel.astype(np.float64)
  92. plt.subplot(246)
  93. plt.imshow(img_Sobel, cmap=plt.cm.gray)
  94. plt.xticks([])
  95. plt.yticks([])
  96. plt.title("sobel_filter")
  97. ################################################
  98. # Prewitt算子
  99. ################################################
  100. img_Prewitt = prewitt_filter(img_gray)
  101. img_Prewitt = img_Prewitt.astype(np.float64)
  102. plt.subplot(247)
  103. plt.imshow(img_Prewitt, cmap=plt.cm.gray)
  104. plt.xticks([])
  105. plt.yticks([])
  106. plt.title("prewitt_filter")
  107. ################################################
  108. # Laplacian算子
  109. ################################################
  110. img_Laplacian = laplacian_filter(img_gray)
  111. img_Laplacian = img_Laplacian.astype(np.float64)
  112. plt.subplot(248)
  113. plt.imshow(img_Laplacian, cmap=plt.cm.gray)
  114. plt.xticks([])
  115. plt.yticks([])
  116. plt.title("laplacian_filter")
  117. plt.show()

结果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/72468
推荐阅读
  

闽ICP备14008679号