Bagaimana untuk melakukan penindasan imej yang tidak maksimum menggunakan Python

王林
Lepaskan: 2023-08-26 10:28:53
asal
1277 orang telah melayarinya

Bagaimana untuk melakukan penindasan imej yang tidak maksimum menggunakan Python

Cara menggunakan Python untuk melakukan penindasan bukan maksimum pada imej

Penindasan bukan maksimum ialah teknik pemprosesan imej yang biasa digunakan dalam penglihatan komputer, digunakan untuk mengekstrak tepi atau sudut dalam imej. Dalam artikel ini, kami akan menggunakan bahasa pengaturcaraan Python bersama-sama dengan perpustakaan OpenCV untuk melaksanakan penindasan imej yang tidak maksimum.

  1. Memasang dan Mengimport Perpustakaan

Pertama, pastikan anda telah memasang perpustakaan Python dan OpenCV. Anda boleh menggunakan pip untuk memasang pustaka OpenCV: pip install opencv-python. pip install opencv-python

然后,导入所需的库:

import cv2
import numpy as np
Salin selepas log masuk
  1. 加载和预处理图像

使用OpenCV的cv2.imread()函数加载图像,并使用灰度图像处理方法将图像转换为灰度图像。灰度图像只包含一个通道,并更容易处理。下面的代码演示了如何加载和预处理图像:

# 读取图像
image = cv2.imread('image.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Salin selepas log masuk
  1. 计算梯度

非极大抑制是基于图像梯度的,并使用梯度的大小和方向来判断是否是极大值。我们可以使用cv2.Sobel()函数计算图像的梯度。

# 计算x和y轴方向的梯度
gradient_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)

# 计算梯度的大小和方向
magnitude = np.sqrt(gradient_x ** 2 + gradient_y ** 2)
angle = np.arctan2(gradient_y, gradient_x)
Salin selepas log masuk
  1. 进行非极大抑制

接下来,我们将使用梯度的大小和方向来进行非极大抑制。对于每个像素,我们将检查其相邻的两个像素,如果梯度的大小比相邻像素大,并且在梯度方向上是极大值,则保留该像素作为边缘。

# 非极大抑制
suppressed = np.zeros_like(magnitude)

for y in range(1, magnitude.shape[0] - 1):
    for x in range(1, magnitude.shape[1] - 1):
        current_gradient = magnitude[y, x]
        current_angle = angle[y, x]

        if (current_angle >= 0 and current_angle < np.pi / 8) or (current_angle >= 7 * np.pi / 8 and current_angle < np.pi):
            before_gradient = magnitude[y, x - 1]
            after_gradient = magnitude[y, x + 1]
        elif current_angle >= np.pi / 8 and current_angle < 3 * np.pi / 8:
            before_gradient = magnitude[y - 1, x - 1]
            after_gradient = magnitude[y + 1, x + 1]
        elif current_angle >= 3 * np.pi / 8 and current_angle < 5 * np.pi / 8:
            before_gradient = magnitude[y - 1, x]
            after_gradient = magnitude[y + 1, x]
        else:
            before_gradient = magnitude[y - 1, x + 1]
            after_gradient = magnitude[y + 1, x - 1]

        if current_gradient >= before_gradient and current_gradient >= after_gradient:
            suppressed[y, x] = current_gradient
Salin selepas log masuk
  1. 显示结果

最后,我们使用cv2.imshow()

Kemudian, import perpustakaan yang diperlukan:

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Non-maximum Suppressed Image', suppressed)
cv2.waitKey(0)
cv2.destroyAllWindows()
Salin selepas log masuk
    Muat dan praproses imej🎜🎜🎜Muat imej menggunakan fungsi cv2.imread() OpenCV dan gunakan imej Skala Kelabu kaedah pemprosesan menukar imej kepada imej skala kelabu. Imej skala kelabu hanya mengandungi satu saluran dan lebih mudah untuk diproses. Kod di bawah menunjukkan cara memuatkan dan pramemproses imej: 🎜rrreee
      🎜Kira kecerunan🎜🎜🎜Penindasan bukan maksimum adalah berdasarkan kecerunan imej dan menggunakan magnitud dan arah kecerunan untuk menentukan sama ada nilai yang melampau Besar. Kita boleh menggunakan fungsi cv2.Sobel() untuk mengira kecerunan imej. 🎜rrreee
        🎜Lakukan penindasan bukan maksimum🎜🎜🎜Seterusnya, kita akan menggunakan magnitud dan arah kecerunan untuk melakukan penindasan bukan maksimum. Untuk setiap piksel, kami akan menyemak dua piksel bersebelahannya, dan jika magnitud kecerunan lebih besar daripada piksel bersebelahan dan merupakan nilai maksimum dalam arah kecerunan, maka kekalkan piksel sebagai tepi. 🎜rrreee
          🎜Tunjukkan hasilnya🎜🎜🎜Akhir sekali, kami menggunakan fungsi cv2.imshow() untuk memaparkan imej asal dan hasil penindasan bukan maksimum. Kodnya adalah seperti berikut: 🎜rrreee🎜Di atas ialah kod contoh lengkap untuk penindasan imej bukan maksimum menggunakan Python. Dengan langkah di atas, kami boleh menggunakan perpustakaan Python dan OpenCV dengan mudah untuk melaksanakan penindasan bukan maksimum untuk mengekstrak tepi atau sudut dalam imej. Parameter dan logik kod boleh dilaraskan mengikut keperluan untuk mencapai hasil yang lebih baik. 🎜

Atas ialah kandungan terperinci Bagaimana untuk melakukan penindasan imej yang tidak maksimum menggunakan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan