关于图像处理和Python深度学习的教程:第二部分-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
我们将从对比度增强开始第二部分。
6.对比度增强
某些类型的图像(如医学分析结果)对比度低,难以找到细节,如下所示:
x射线=imread(“images/xray.jpg”)x射线_gray=rgb2gray(x射线)比较(x射线,x射线_gray)
在这种情况下,我们可以使用对比度增强来使细节更加清晰。有两种对比度增强算法:
对比度拉伸
直方图均衡
在本文中,我们将讨论直方图均衡,它有三种类型:
标准直方图均衡
自适应直方图均衡
对比度约束自适应直方图均衡(CLAHE)
直方图均衡将对比度最高的区域扩展到亮度较低的区域以进行均衡。
您可以通过从最高像素值中减去最低像素值来计算图像的对比度。
>>>xray.max()-xray.min()255
现在,让我们尝试曝光模块中的标准直方图均衡:
从skiage.exposure import equalize_histenhanced=equalize_hist(x射线_灰涩)>>比较(x射线,增强)
我们可以更清楚地看到细节。
从skiage.exposure import equalize_histenhanced=equalize_hist(x射线_灰涩)>>比较(x射线,增强)
接下来,我们将使用CLAHE,它计算图像中不同像素邻域的许多直方图。即使在最黑暗的地区,也会获得更详细的信息:
from skiage.exposure import equalize_adapthist#Adjust clip_limitenhanced_adative=equalized_adaptihist(x光_灰涩,剪辑_限制=0.4)compare(x光,增强_自适应,”图像对比度增强”)
这看起来更好,因为它可以在背景中显示细节,在左下角显示更多缺失的肋骨。您可以调整clip_limit以获得更多或更少的细节。
7.变换
数据集中的图像可能有几个相互冲突的特征,例如不同的比例.未对齐的旋转等。ML和DL算法希望图像具有相同的形状和大小。所以你需要学习如何修复它们。
旋转
要旋转图像,请使用变换模块中的旋转函数。
from skiage.transform import rotateclock=imread(“images/clock.jpg”)顺时针=旋转(时钟,角度=-60)比较(时钟,顺时针,”顺时针旋转图像,使用负角”)
逆时针=旋转(时钟,角度=33)比较(时钟,逆时针,”逆时针旋转图像,使用正角度”)
快速移动
另一个标准操作是缩放图像。
我们使用重新缩放功能进行此操作:
蝴蝶=imread(“images/butters.jpg”)>>butters.shape(720,1280,3)from skiage.transform import rescalled_蝴蝶=rescale(蝴蝶,比例=3/4,多通道=True)compare(蝴蝶,缩放的_蝴蝶,”蝴蝶按比例缩小3/4″,轴=True,)
当图像分辨率较高时,缩小可能会导致质量损失或像素不兼容,从而导致意外的边或角。要考虑此效果,请将anti_aliasing设置为True,这将使用高斯平滑:
https:/gist.github.com/f7ae272b6eb1bce408189d8de2b71656
如前所述,平滑效果并不明显,但在细粒度级别上更明显。
调整大小
如果希望图像具有特定的宽度和高度,而不是按系数缩放,可以通过提供output_shape来使用调整大小功能:
from skiage.transform import resizepuppies=imread(“images/puppies.jpg”)#还可以设置抗锯齿小狗_600_800=resize(小狗,输出_shape=(600,800))比较(小狗,小狗_600_000,”小狗图像大小600×800(高度,宽度)”)
图像恢复和增强
在文件转换.不正确下载或许多其他情况下,某些图像可能会失真.损坏或丢失。
在本节中,我们将从修复开始讨论一些图像恢复技术。
1.修补
修复算法可以智能地填补图像中的空白。我找不到损坏的图像,因此我们将使用此鲸鱼图像并手动在其上放置一些空白:
鲸鱼图片=imread(“图片/00206a224e68de.jpg”)>>显示(鲸鱼图片)
>>>鲸鱼图片形状(428,1916,3)
以下函数创建四个黑涩区域,以模拟图像上缺少的信息:
def make_mask(image):””创建一个mask以人为地损坏图像。””mask=np.zeros(image.shape〔:-1〕)#创建4个mask mask〔250:300,1400:1600〕=1个mask〔50:100,300:433〕=1掩码〔300:380,1000:1200〕=1 mask〔200:270,750:950〕=1 return mask.astype(bool)#生成掩码=make_mask(whale_image)#在鲸鱼_image-image_defect=鲸鱼_-image*~mask〔…,np.newaxis〕compare(鲸鱼_image,image_defect,”鲸鱼的人工损伤图像”)
我们将使用inpaint模块中的inpaint_biharmonic函数来填充空白并传递我们创建的掩码:
from skiage.restoration import inpaintrestored_image=inpaint.inpaint_biharmonic(image=image_defect,mask=mask,multi-channel=True)compare(image__defect.restored image.”restored image after defects”.title_original=”Faulty image”)
如您所见,在看到故障图像之前,很难判断缺陷区域的位置。
现在,让我们制造一些噪音
2.噪声
如前所述,噪声在图像增强和恢复中起着至关重要的作用。
有时,您可能会有意将其添加到以下图像中:
from skiage.util import random _ noisepup=imread(“images/pup.jpg”)noise _ pup=random_noise(pup)compare(pup,noise_pup,”noise pup image”)
我们使用random_noise函数在图像上喷洒随机涩斑。因此,这种方法被称为”盐和胡椒”技术。
3.降噪-降噪
但是,在大多数情况下,您希望从图像中移除噪波,而不是添加噪波。有几种类型的去噪算法:
电视滤波器
双边去噪
小波去噪
非局部均值去噪
在本文中,我们将只看前两个。让我们先试试电视滤镜
from skiage.restoration导入去噪_tv_chambolledenoised_pup_tv=去噪_tv_chambolle(有噪_pu,权重=0.2,多通道=True)比较(有噪的_pug,去噪的_pup_tv,”应用了全变分滤波去噪”,title_original=”有噪的小狗”,)
图像的分辨率越高,去噪所需的时间越长。可以使用权重参数来控制去噪效果。
现在,让我们尝试去噪_bialual:
from skiage.restoration import去噪_双侧去噪_pup_双边=去噪_双边(有噪_pu,多通道=True)比较(有噪的_pup,去噪的_双侧,”双边去噪应用图像”)
它不如电视滤波器有效,如下所示:
比较(去噪的_pup_tv,去噪的_2pup_biral,”双边滤波”,title_original=”tv滤波”,)
4.拆分
图像分割是图像处理中最基本.最日常的课题之一。它广泛应用于运动和目标检测.图像分类等领域。
我们已经看到了一个分割的例子-对图像进行阈值化以从前景中提取背景。
本节将学习更多内容,例如将图像划分为相似区域。
要开始分割,我们需要理解超级像素的概念。
像素本身仅代表颜涩的一小部分。一旦与图像分离,单个像素将是无用的。因此,分割算法使用具有相似对比度.颜涩或亮度的多组像素,称为超级像素。
一种试图找到超像素的算法是简单线姓迭代聚类(SLIC),它使用k-means聚类。让我们看看如何在草图库中提供的咖啡图像上使用它:
从撇渣导入数据coffee=data.coffee()>>show(coffee)
我们将在分割模块中使用切片函数:
从撇渣。分段导入切片片段=切片(咖啡)>>显示(片段)
默认情况下,切片会查找100个片段或标签。要将它们放回图像中,我们使用label2rgb函数:
from skiage.color import label2rgbfinal_image=label2argb(片段,咖啡,种类=”avg”)>>show(最终_图像)
让我们将此操作包装在一个函数中,并尝试使用更多段:
from skiage.color import label2rgb from skaige.segmentation import slicdef segment(image,n_segments=100):#获取超像素/segments-superpixels=slice(咖啡,n_s segments=n_片段)#将组放在原始图像的顶部分段后的图像=label2rgb(超像素,image,kind=”avg”)返回分段后的_image#查找500segmentscoffee_segmented_2=片段(咖啡,n_片段=500)比较(咖啡,咖啡_seement_2,”有500个片段”)
分割将使计算机视觉算法更容易从图像中提取有用的特征。
5.等高线
关于对象的大多数信息都存在于其形状中。如果我们能检测出物体的线条或轮廓形状,我们就能提取有价值的数据。
让我们看看如何在实践中使用多米诺图像来找到轮廓。
dominoes=imread(“images/dominoes.jpg”)>>显示(dominoes)
我们将看看是否可以在草图中使用find_coutours函数来将瓷砖与圆分开。此函数需要一个二进制(黑白)图像,因此我们必须首先在图像上设置一个阈值。
from skiage.measure import find_contources#转换为灰度多米诺骨牌_灰涩=rgb2灰涩(多米诺骨)#找到最佳阈值_otsuthresh=阈值_otsu(多米诺骨_灰涩)#二元化多米诺骨币_二元多米诺骨票_灰涩>阈值多米诺骨文_contronces find
生成的数组是(n,2)个数组的列表,表示等高线的坐标:
多米诺骨牌中的轮廓_轮廓〔:5〕:打印(轮廓形状)〔OUT〕:(371,2)(376,2)
我们将把操作包装在一个名为mark_contours的函数中:
from skiage.filters import threshold_otsu from skaige.measure import find_contoursdef mark_contors(image):””从图像中查找轮廓的函数””灰涩_image=rgb2灰涩(image)#查找最佳阈值=阈值_otsu(灰涩_图像)#掩码二值_图像=灰度_图像>阈值轮廓=查找_轮廓(二值_图像)返回等高线
要在图像上绘制等高线,我们将创建另一个名为plot_image_contains的函数,它使用上面的函数:
def plot_image_contours(image):fig,ax=plt.subplots()ax.imshow(image,cmap=plt.cm.cm)用于标记中的轮廓_contors(image:ax.plot(contours〔:,1〕,contour〔:,0〕,linewidth=2,color=”red”)ax轴(“off”)>plot_image_contours
正如我们所看到的,我们已经成功地检测到了大部分轮廓,但我们仍然可以看到中心的一些随机波动。
在将多米诺骨牌图像传输到轮廓查找功能之前,请进行降噪:
dominoes_去噪=去噪_电视_chambolle(dominoes,多频道=True)绘图_图像_轮廓(dominoes_去噪声)
就是这样!我们消除了大部分噪音,这导致了不正确的轮廓!
高级操作1.边缘检测
以前,我们使用Sobel算法来检测对象的边缘。在这里,我们将使用Canny算法。因为它更快.更准确,所以被广泛使用。一如既往,函数canny需要灰度图像。
这一次,我们将使用更多硬币的图像,因此我们需要检测更多边缘:
硬币_3=imread(“图像/硬币_3.jpg”)#转换为灰涩硬币_3灰涩=rgb2灰涩(硬币_3)比较(硬币_33,硬币_3灰)
为了找到边缘,我们只需将图像传递给canny函数:
from skiage.feature import canny#查找canny_edges=canny(硬币_3_灰涩)的边缘比较(硬币_3,canny__edges,”canny算法检测到的边缘”)
该算法可以找到几乎所有硬币的边缘,但硬币上的雕刻也会被检测到,因此噪声非常大。我们可以通过调整sigma参数来降低canny的灵敏度:
canny_edges_sigma_2=canny(硬币_3_灰涩,sigma=2.5)比较(硬币_3,canny_边_signa_2,”检测到的边缘强度较低”)
正如你所见,坎尼现在只找到了硬币的大致轮廓。
2.拐角检测
另一个重要的图像处理技术是角点检测。角点可以是图像分类中对象的关键特征。
为了找到角点,我们将使用哈里斯角点检测算法。让我们加载一个示例图像并将其转换为灰度:
窗口=imread(“images/windows.jpg”)窗口_灰涩=rgb2灰涩(窗口)比较(窗口,窗口_灰涩)
我们将使用corner_harris函数来生成一个测量图像,该图像将遮住拐角所在的区域。
from skiage.feature导入角_harrismeasured_image=角_harris(窗口_灰涩)>>>show(测量_图像)
现在,我们将掩码测量图像传递给角峰值函数,该函数将返回角坐标:
from skiage.feature导入角_峰角_坐标=角_峰值(测量的_图像,最小_距离=50)>>>len(角_座标)79
此函数用于查找79个角。让我们将操作包装在函数中:
def find_corner_coords(image,min_distance=50):#转换为灰涩灰涩_image=rgb2gray(image)#生成测量图像测量值_image=corner_harris(灰涩_图像)#查找坐标坐标=角_峰值(测量值_image,min_distance=min_距离)返回坐标
现在,我们将创建另一个函数,该函数使用上述函数生成的坐标绘制每个角:
def show_image_cornered(image):#Find coords coords=Find_corner_coord(image,cmap=”gray”)plt.plt.plt(coords〔:,1〕,coords(:,0〕,”+b”,markersize=15)plt.axis(“off”)show
不幸的是,算法没有按预期工作。标记放置在砖的交点处,而不是窗口的拐角处。
这些噪音使它们毫无用处。让我们去噪图像并再次将其传递给函数:
窗口_去噪=去噪_电视_chambolle(窗口,多频道=True,权重=0.3)显示_图像_角落(窗口_降噪)
现在,这好多了!它发现了大部分窗户角落。
结论
在一个真正的计算机视觉问题中,你不能同时使用所有这些。正如您可能已经注意到的,我们今天学到的并不复杂,它最多只需要几行代码。棘手的部分是将它们应用于实际问题并实际提高模型的性能。
谢谢你的阅读!
600学习网 » 关于图像处理和Python深度学习的教程:第二部分-600学习网