Python 图像处理—使用 Scikit-Image 进行斑点检测

欢迎关注 “小白玩转Python”,发现更多 “有趣”

引言

图像处理时,我们需要的最重要的技能之一就是能够识别图像中的特定部分。一张图片只有在特定的感兴趣点能够被识别和分别列出的情况下才有用。在本文中,我们将了解如何做到这一点。

让我们从导入本文所需的库开始!

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import skimage
from skimage.io import imread, imshow
from skimage.color import rgb2gray, rgb2hsv
from skimage.measure import label, regionprops, regionprops_table
from skimage.filters import threshold_otsu
from scipy.ndimage import median_filter
from matplotlib.patches import Rectangle
from tqdm import tqdm

现在让我们加载图像。

tree = imread('laughing_tree.png')
imshow(tree);

我们的任务是识别和隔离图像中包含树木独特果实的部分(看起来像张开的嘴)。

首先让我们尝试看看是否有任何简单的方法来基于图像的值进行识别。让我们将图像转换为灰度,并使用 Otsu 方法。

tree_gray = rgb2gray(tree)
otsu_thresh = threshold_otsu(tree_gray)
tree_binary = tree_gray < otsu_thresh
imshow(tree_binary, cmap = 'gray');

这显然不能很好地解决这个问题,让我们尝试在几个不同阈值上进行迭代。

def threshold_checker(image):
    thresholds =  np.arange(0.1,1.1,0.1)
    tree_gray = rgb2gray(image)
    fig, ax = plt.subplots(2, 5, figsize=(17, 10))
    for n, ax in enumerate(ax.flatten()):
        ax.set_title(f'Threshold  : {round(thresholds[n],2)}',      
                       fontsize = 16)
        threshold_tree = tree_gray < thresholds[n]
        ax.imshow(threshold_tree);
        ax.axis('off')
    fig.tight_layout()
threshold_checker(tree)

我们可以看到,尽管阈值处理似乎有所帮助,但它仍然包含了我们不感兴趣的图像部分。让我们尝试另一种方法。

tree_hsv = rgb2hsv(tree[:,:,:-1])
plt.figure(num=None, figsize=(8, 6), dpi=80)
plt.imshow(tree_hsv[:,:,0], cmap='hsv')
plt.colorbar();

如果将图像放入HSV色彩空间中,我们可以看到水果明显具有红色色调,该红色色调在图像的其他部分不存在。让我们尝试分离图像的这些部分。

lower_mask = tree_hsv [:,:,0] > 0.80
upper_mask = tree_hsv [:,:,0] <= 1.00
mask = upper_mask*lower_mask
red = tree[:,:,0]*mask
green = tree[:,:,1]*mask
blue = tree[:,:,2]*mask
tree_mask = np.dstack((red,green,blue))
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(tree_mask);

可以看到,除了果实,还保留了大部分的天空部分。参考上一个色相通道图像,我们可以看到这些部分在水果中也存在相同种类的红色。

为了解决这个问题,让我们检查一下图像的 Value 通道。

tree_hsv = rgb2hsv(tree[:,:,:-1])
plt.figure(num=None, figsize=(8, 6), dpi=80)
plt.imshow(tree_hsv[:,:,2], cmap='gray')
plt.colorbar();

可以看到那些明亮区域的值非常的高,在创建mask的时候我们需要考虑这一点。

lower_mask = tree_hsv [:,:,0] > 0.80
upper_mask = tree_hsv [:,:,0] <= 1.00
value_mask = tree_hsv [:,:,2] < .90
mask = upper_mask*lower_mask*value_mask
red = tree[:,:,0] * mask
green = tree[:,:,1] * mask
blue = tree[:,:,2] * mask
tree_mask = np.dstack((red, green, blue))
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(tree_mask);

很好!现在我们需要找到一种方法来清理图像中的小白点。为此,我们可以简单地使用 Skimage 库中的中值滤波函数。

lower_mask = tree_hsv [:,:,0] > 0.80
upper_mask = tree_hsv [:,:,0] <= 1.00
value_mask = tree_hsv [:,:,2] < .90
mask = median_filter(upper_mask*lower_mask*value_mask, 10)
red = tree[:,:,0] * mask
green = tree[:,:,1] * mask
blue = tree[:,:,2] * mask
tree_mask = np.dstack((red, green, blue))
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(tree_mask);

可以看到,结合了中值过滤器可以使我们获得非常清晰的图像。现在我们需要标识每个,为此,我们需要使用 Skimage 中的 label 函数。

tree_blobs = label(rgb2gray(tree_mask) > 0)
imshow(tree_blobs, cmap = 'tab10');

可以看到该函数标识了图像中的不同。现在的下一步是获取每个斑点的属性。为此,我们需要使用 Skimage 中的 regionprops_table 函数。

properties =['area','bbox','convex_area','bbox_area',
             'major_axis_length', 'minor_axis_length',
             'eccentricity']
df = pd.DataFrame(regionprops_table(tree_blobs, properties = properties))

regionprops_table 函数在数据帧中为我们提供每个斑点的属性,这使我们能够轻松地操作数据。让我们使用bbox特性在图像上绘制边界框。

blob_coordinates = [(row['bbox-0'],row['bbox-1'],
                     row['bbox-2'],row['bbox-3'] )for 
                    index, row in df.iterrows()]
fig, ax = plt.subplots(1,1, figsize=(8, 6), dpi = 80)
for blob in tqdm(blob_coordinates):
    width = blob[3] - blob[1]
    height = blob[2] - blob[0]
    patch = Rectangle((blob[1],blob[0]), width, height, 
                       edgecolor='r', facecolor='none')
    ax.add_patch(patch)
ax.imshow(tree);
ax.set_axis_off()

成功了!

最后,让我们从图像中切出边界框,并将其显示为自己的图像。

fig, ax = plt.subplots(1, len(blob_coordinates), figsize=(15,5))
for n, axis in enumerate(ax.flatten()):
    axis.imshow(tree[int(blob_coordinates[n][0]):
                     int(blob_coordinates[n][2]), 
                     int(blob_coordinates[n][1]):
                     int(blob_coordinates[n][3])]);
    
fig.tight_layout()

总结

了解如何进行斑点检测对于图像处理来说都是非常重要的。它可以用来将图像的不同部分分割成不同的兴趣点。虽然这是一个相对简单和直接的介绍,但希望对你哟一个启发性的认识,如何通过使用斑点检测来解决基本的图像问题。

·  END  ·

HAPPY LIFE

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 您可以通过以下步骤安装scikit-image: 1. 打开命令行窗口或终端。 2. 输入以下命令安装pip(如果您已经安装了pip,请跳过此步骤): ``` python -m ensurepip --default-pip ``` 3. 输入以下命令安装scikit-image: ``` pip install -U scikit-image ``` 4. 等待安装完成即可。 ### 回答2: scikit-image是一款Python图像处理库,它能够为我们提供各种各样的图像处理和计算机视觉相关的功能,如图像滤波、变换、分割、特征提取等。scikit-image库底层依赖于NumPy、SciPy和matplotlib等Python科学计算库,因此在安装scikit-image之前,需要确保NumPy、SciPy和matplotlib等库已经安装成功。 下面介绍安装scikit-image的具体步骤: 1.安装Python环境 在安装scikit-image之前,需要先安装Python环境。可以从Python官网(https://www.python.org/)下载对应版本的Python安装包,按照安装向导依次安装即可。 2.安装pip pip是用来安装Python第三方库的包管理工具,可以通过在终端中输入以下命令来安装pip: python get-pip.py 其中get-pip.py是pip的安装文件,可以从官方网站(https://bootstrap.pypa.io/get-pip.py)下载。 3.安装依赖库 由于scikit-image依赖于NumPy、SciPy、matplotlib等库,因此在安装scikit-image之前,需要先安装这些依赖库。可以在终端中输入以下命令来安装: pip install numpy scipy matplotlib 4.安装scikit-image 安装依赖库之后,就可以安装scikit-image了。可以在终端中输入以下命令来安装: pip install scikit-image 安装完成后,可以在Python中导入scikit-image库,如下: import skimage 需要注意的是,由于scikit-image底层是用Cython编写的,因此在安装scikit-image时,需要确保Cython已经安装,否则会出现安装失败的情况。可以在终端中输入以下命令来安装Cython: pip install cython ### 回答3: scikit-image是针对影像处理而设计的Python包。它提供了一整套基于numpy的图像处理和计算机视觉算法,同时该包采用了sklearn、scipy和matplotlib等外部包来实现。这样就使得它在实现特定任务时可以充分利用其他包的强大功能,降低了实现成本。Python标准库中包含的图像处理模块(如pillow)功能较为简单,适合处理基本的图像问题,而scikit-image则具有更为广泛的应用,因为它可以完成更加复杂的图像操作。本篇文章将向你介绍如何在Python中安装scikit-imagescikit-image的安装有两种方式: 方法一: 第一步:安装Python,可以到官网(https://www.python.org/downloads/)下载Python3.6+版本的安装文件。 第二步:安装pip,可以到Python官网下方找到get-pip.py文件,运行该文件即可安装pip。 命令:python get-pip.py 第三步:安装依赖的库 scikit-image依赖于其他的库,需要先安装这些库,命令如下: numpy安装:pip install numpy scipy安装:pip install scipy matplotlib安装:pip install matplotlib imageio安装:pip install imageio 第四步:安装scikit-image库 pip install scikit-image 这样就成功完成了scikit-image库的安装。 方法二: 直接利用Anaconda进行安装: Anaconda是一个比较完整的数据科学和机器学习环境,内置了诸多包。这样的话就不需要再单独安装numpy、scipy、matplotlib、imageio等库了。可以直接打开Anaconda Navigator,选择Environment Tab,然后创建一个新的Python环境。 在这个新的Python环境中安装scikit-image: 打开Anaconda Prompt,输入命令: conda install -c conda-forge scikit-image 等待安装完成即可。 总结: 以上就是在Python中安装scikit-image的两种方法,它们都可以用来完成scikit-image的安装。如果你已经安装了Anaconda,那么采用第二种方法可以更为方便。无论选择哪种方法,需要注意的是依赖库的安装很重要,否则导入scikit-image会出现问题。在使用之前可以先简单的测试一下,如果无法导入,可以使用Anaconda Prompt中的命令进行检查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值