Izinkan saya memulakan tutorial ini dengan beberapa istilah teori. Apabila kita bercakap tentang Peningkatan Imej, ia pada asasnya bermakna kita mahukan versi baharu imej yang lebih sesuai daripada imej asal.
Sebagai contoh, apabila anda mengimbas dokumen, kualiti imej output mungkin lebih rendah daripada imej input asal. Oleh itu, kami memerlukan satu cara untuk meningkatkan kualiti imej keluaran supaya ia lebih ekspresif secara visual kepada penonton, dan di sinilah peningkatan imej dimainkan. Apabila kami meningkatkan imej, perkara yang kami lakukan ialah menajamkan ciri imej, seperti kontras dan tepi.
Perlu diingatkan bahawa peningkatan imej tidak meningkatkan kandungan maklumat imej, tetapi meningkatkan julat dinamik ciri yang dipilih, akhirnya meningkatkan kualiti imej. Jadi di sini kita sebenarnya tidak tahu bagaimana rupa imej keluaran, tetapi kita seharusnya dapat memberitahu (secara subjektif) jika terdapat sebarang penambahbaikan, seperti memerhati lebih banyak butiran dalam imej output.
Peningkatan imej sering digunakan sebagai langkah pra-pemprosesan antara langkah asas yang terlibat dalam pemprosesan imej digital (iaitu segmentasi, perwakilan). Terdapat banyak teknik untuk meningkatkan imej, tetapi saya akan membincangkan dua dalam tutorial ini: Sbalik Imej dan Transformasi Undang-undang Kuasa. Kami akan melihat bagaimana untuk melaksanakannya dalam Python. Mari mulakan!
Seperti yang anda mungkin telah meneka daripada tajuk bahagian ini (yang juga boleh dipanggil penyongsangan imej), tujuan penyongsangan imej adalah untuk menukar keamatan gelap dalam imej input kepada keamatan cahaya dalam imej. imej output, dan keamatan cahaya dalam imej input kepada keamatan gelap dalam imej output. Dengan kata lain, kawasan gelap menjadi lebih terang dan kawasan terang menjadi lebih gelap.
Andaikan bahawa I(i,j)
merujuk kepada nilai keamatan piksel yang terletak di (i,j)
. Untuk menjelaskan di sini, nilai keamatan dalam imej skala kelabu berada dalam julat [0,255]
, manakala (i,j)
merujuk kepada nilai baris dan lajur, masing-masing. Apabila kita menggunakan operator songsang imej pada imej skala kelabu, nilai O(i,j)
piksel output ialah: I(i,j)
指的是位于 (i,j)
处的像素的强度值。这里澄清一下,灰度图像中的强度值落在 [0,255]
范围内,而 (i,j)
指的是行和列值, 分别。当我们对灰度图像应用图像逆运算符时,输出像素 O(i,j)
值为:
O(i,j) = 255 - I(i,j)
现在,我们的大多数图像都是彩色图像。这些图像包含三个通道:红色、绿色和蓝色,称为 RGB
图像。在这种情况下,与上面的公式相反,我们需要从 255 中减去每个通道的强度。因此输出图像在像素 (i ,j)
:
O_R(i,j) = 255 - R(i,j) O_G(i,j) = 255 - G(i,j) O-B)i,j) = 255 - B(i,j)
介绍完之后,我们来看看如何在 Python 中实现图像逆运算符。我想提一下,为了简单起见,我将在灰度图像上运行该运算符。但我会给您一些关于在彩色图像上应用该运算符的想法,并且我会将完整的程序留给您作为练习。
对于彩色图像,您需要做的第一件事是提取每个像素通道(即 RGB)强度值。为此,您可以使用 Python 成像库 (PIL)。继续从 baboon.png 下载示例狒狒图像。图像的大小为 500x500
。假设您要提取位于像素位置 (325, 432)
处的红色、绿色和蓝色强度值。这可以按如下方式完成:
from PIL import Image im = Image.open('baboon.png') print(im.getpixel((325,432)))
根据文档,方法 getpixel()
的作用是:
返回给定位置的像素值。
运行上面的脚本后,你会发现你只得到以下结果:138
!但是三个通道的 (RGB) 强度值在哪里?问题似乎与正在读取的图像的 mode
有关。通过运行以下语句检查模式:
print(im.mode)
您将得到输出 P
,这意味着图像是在调色板模式下读取的。您可以做的一件事是在返回不同通道的强度值之前将图像转换为 RGB 模式。为此,您可以使用 convert()
方法,如下所示:
rgb_im = im.convert('RGB')
在这种情况下,您将得到以下返回值:(180, 168, 178)
from PIL import Image im = Image.open('baboon.png') rgb_im = im.convert('RGB') print(rgb_im.getpixel((325,432)))
merah
,hijau dan biru, dan dipanggil imej RGB
. Dalam kes ini, bertentangan dengan formula di atas, kita perlu menolak keamatan setiap saluran daripada 255. Oleh itu imej output adalah dalam piksel (i ,j)
:
from PIL import Image im = Image.open('baboon.png') rgb_im = im.convert('RGB') width, height = im.size for w in range(width): for h in range(height): print(rgb_im.getpixel((w,h)))
Selepas pengenalan, mari kita lihat cara melaksanakan pengendali songsang imej dalam Python. Saya ingin menyebut bahawa untuk kesederhanaan, saya akan menjalankan operator ini pada imej skala kelabu. Tetapi saya akan memberi anda beberapa idea tentang menggunakan operator ini pada imej berwarna, dan saya akan menyerahkan program lengkap kepada anda sebagai latihan.
Untuk imej berwarna, perkara pertama yang anda perlu lakukan ialah mengekstrak setiap nilai keamatan saluran piksel (iaitu RGB). Untuk melakukan ini, anda boleh menggunakan Perpustakaan Pengimejan Python (PIL). Teruskan memuat turun contoh imej babun dari baboon.png. Saiz imej ialah 500x500
. Katakan anda ingin mengekstrak nilai keamatan merah, hijau dan biru di lokasi piksel (325, 432)
. Ini boleh dilakukan seperti berikut:
import cv2 import numpy as np from PIL import Image img = Image.open('boat.png') array_img = np.array(img) image_invert = np.invert(array_img) cv2.imwrite('new_boat.jpg', image_invert)
Menurut dokumentasi, fungsi kaedah getpixel()
ialah:
Mengembalikan nilai piksel di lokasi yang diberikan.🎜Selepas menjalankan skrip di atas, anda akan mendapati bahawa anda hanya mendapat keputusan berikut:
138
! Tetapi di manakah nilai keamatan (RGB) untuk tiga saluran? Masalahnya nampaknya berkaitan dengan mod
imej yang sedang dibaca. Semak corak dengan menjalankan pernyataan berikut: 🎜
p(i,j) = kI(i,j)^gamma
P
, yang bermaksud imej dibaca dalam mod palet. Satu perkara yang boleh anda lakukan ialah menukar imej kepada mod RGB sebelum mengembalikan nilai keamatan saluran yang berbeza. Untuk melakukan ini, anda boleh menggunakan kaedah convert()
seperti yang ditunjukkan di bawah: 🎜
p(i,j) = I(i,j)^gamma
(180, 168, 178)
. Ini bermakna nilai keamatan untuk saluran merah, hijau dan biru ialah 180, 168, dan 178 masing-masing. 🎜
🎜Menggabungkan semua yang telah kami huraikan setakat ini, skrip Python yang mengembalikan nilai RGB imej kelihatan seperti ini: 🎜
import cv2 import numpy as np im = cv2.imread('boat.tiff') im = im/255.0 im_power_law_transformation = cv2.pow(im,0.6) cv2.imshow('Original Image',im) cv2.imshow('Power Law Transformation',im_power_law_transformation) cv2.waitKey(0)
我将使用 numpy 库来完成此任务。在上面的图像上应用图像逆运算符的 Python 脚本应如下所示:
import cv2 import numpy as np from PIL import Image img = Image.open('boat.png') array_img = np.array(img) image_invert = np.invert(array_img) cv2.imwrite('new_boat.jpg', image_invert)
Numpy 是一个用于使用 Python 进行科学计算的 Python 包。 OpenCV-Python 是一个旨在解决计算机视觉问题的库。 OpenCV-Python 与 numpy 捆绑在一起,因此如果先安装 OpenCV-Python,则无需安装 numpy。我们首先用 Pillow 打开图像,然后将其转换为 numpy 数组。
然后我们使用numpy的invert()
函数将图像反转并保存新的反转图像。 invert()
函数会将白色转换为黑色,反之亦然。
下面左边是原始图像,右边是新反转的图像。
请注意,应用该运算符后,图像的某些特征变得更加清晰。例如,看看右侧图像中的云彩和灯塔。
这个算子,也称为伽马校正,是我们可以用来增强图像的另一个算子。让我们看看算子方程。在像素 (i,j)
处,运算符如下所示:
p(i,j) = kI(i,j)^gamma
I(i,j)
是图像位置处的强度值 (i,j)
; k
和 gamma
是正常数。我不会在这里讨论数学细节,但我相信您可以在图像处理书籍中找到该主题的详尽解释。但需要注意的是,在大多数情况下,k=1
,所以我们主要是改变gamma的值。因此,上述方程可以简化为:
p(i,j) = I(i,j)^gamma
我将在这里使用 OpenCV
和 NumPy
库。如果您需要了解有关该库的更多信息,请查看我的教程 NumPy 简介。我们的测试图像将再次是boat.tiff(继续下载它)。
执行幂律变换运算符的 Python 脚本如下所示:
import cv2 import numpy as np im = cv2.imread('boat.tiff') im = im/255.0 im_power_law_transformation = cv2.pow(im,0.6) cv2.imshow('Original Image',im) cv2.imshow('Power Law Transformation',im_power_law_transformation) cv2.waitKey(0)
请注意,我们选择的 gamma 值是 0.6
。下图显示了原始图像以及对该图像应用幂律变换算子的结果(左图为原始图像,右图为应用幂律变换算子后的结果)。
上面的结果是 gamma = 0.6
时的结果。让我们看看当我们将 gamma 增加到 1.5
时会发生什么,例如:
请注意,当我们增加伽马值时,图像会变得更暗,反之亦然。
您可能会问幂律变换有什么用处。事实上,用于图像采集、打印和显示的不同设备根据幂律变换算子进行响应。这是因为人脑使用伽马校正来处理图像。例如,当我们希望在计算机显示器或电视屏幕上正确显示图像(所有图像中显示最佳图像对比度)时,伽马校正就被认为很重要。
在本教程中,您学习了如何使用 Python 增强图像。您已经了解了如何使用图像逆算子突出显示特征,以及如何将幂律变换视为在计算机显示器和电视屏幕上正确显示图像的关键算子。
Atas ialah kandungan terperinci Teknologi peningkatan imej berasaskan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!