在 Google Colab 中使用 OpenCV 进行图像处理简介
共 3659字,需浏览 8分钟
·
2021-09-08 06:13
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
在这篇文章中,我们将实现如何使用 OpenCV 在 google colaboratory 中进行图像处理。为此,我们应该了解一些 Python 基础知识,下面给出的步骤将帮助我们在 Google Colab 中使用 OpenCV 进行图像处理,这有助于机器学习人工智能。
图像处理的6个步骤:
步骤 1:加载依赖项
我们将加载一些必需的库,例如:Numpy, pandas, cv2, skimage, PIL and Matplotlib。在 Google colab 上加载依赖项:
import numpy as np
import pandas as pd
import cv2 as cv
from google.colab.patches import cv2_imshow
from skimage import io
from PIL import Image
import matplotlib.pylab as plt
第 2 步:从 URL 读取图像
在这一步中,我们将从 URL 中读取图像,并在 google colab 中使用 OpenCV 显示它们,我们将使用以下代码来显示图像。
让我们在 Google colab 上尝试一下,这些是图像的 URL。
urls = ["https://iiif.lib.ncsu.edu/iiif/0052574/full/800,/0/default.jpg",
"https://iiif.lib.ncsu.edu/iiif/0016007/full/800,/0/default.jpg",
"https://placekitten.com/800/571"]
for url in urls:
image = io.imread(url)
image_2 = cv.cvtColor(image, cv.COLOR_BGR2RGB)
final_frame = cv.hconcat((image, image_2))
cv2_imshow(final_frame)
print('\n')
运行上面给出的代码后,上面显示的图像将作为结果显示。请注意读取 RGB 和 BGR 格式的图像时的区别,OpenCV 的默认输入颜色通道采用 BGR 格式。
第 3 步:图像轮廓和直方图
我们将使用以下代码:
print(image.dtype)
print(image.shape[0])
print(image.shape[1])
print(image.shape[2])
然后检查图像矩阵数据类型,图像的高度,图像的宽度,图像的通道数。现在让我们显示彩色图像中所有像素的直方图。
plt.hist(image.ravel(),bins = 256, range = [0,256])
plt.show()
显示R、G、B 通道的直方图。我们可以观察到,绿色通道在 255 中有很多像素,这表示图像中的白色块。
color = ('b','g','r')
for i, col in enumerate(color):
histr = cv.calcHist([image],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
现在让我们尝试制作灰度图像,在这里,我们成功地得到了一只猫的灰色图像,绘制灰度图像的直方图。
gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv2_imshow(gray_image)
我们可以观察到图像直方图的频率降低了彩色图像直方图的 1/3。
plt.hist(gray_image.ravel(),bins = 256, range = [0, 256])
plt.show()
第 4 步:灰度变换和直方图均衡化
灰度变换提供了一些对灰度图像进行数学变换的示例。
im2 = 255 - gray_image
cv2_imshow(im2)
这是灰度图像的逆运算,我们可以看到明亮的像素变暗,而暗的像素变亮。
im3 = (100.0/255)*gray_image + 100
cv2_imshow(im3)
在添加常量后,对图像进行另一个变换。所有的像素都变得更亮,并且产生了图像的模糊效果。在这一步骤之后,灰度图像的亮度级别会降低。
第 5 步:灰度图像的傅立叶变换
傅里叶变换用于找到图像的频域,让我们继续使用一段代码,它通过内核大小为 10 的高斯滤波器对灰度图像进行模糊,并将图像变换到频域。
imBlur = cv.blur(gray_image,(5,5))
f = np.fft.fft2(imBlur)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 30*np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(imBlur, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
步骤 6:通过 FFT 中的高通滤波查找边缘
最后一步演示如何使用高通滤波器去除低频分量,从而生成包含边缘的锐化图像。
rows, cols = imBlur.shape
crow, ccol = round(rows/2) , round(cols/2)
fshift[crow-10:crow+10, ccol-10:ccol+10] = 0
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
plt.figure(figsize=([20, 20]))
plt.subplot(131),plt.imshow(imBlur, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()
好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~