欢迎关注 “小白玩转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

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

  1. python斑点检测

    对于简单的场景管用,复杂的场景效果不明显. 方法一:基于LoG算子的圆斑检测. 这是常用的斑点检测方法,可参考http://doc.okbase.net/ronny/archive/102540.ht ...

  2. [Python图像处理] 二十八.OpenCV快速实现人脸检测及视频中的人脸

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. [Python图像处理] 使用 HSV 色彩空间检测病毒对象

    使用 HSV 色彩空间检测病毒对象 前言 检测病毒对象 相关链接 前言 在本节中,我们将学习如何使用 OpenCV 在 HSV 色彩空间中使用特定颜色检测感兴趣对象.我们需要通过指定颜色值范围识别和提 ...

  4. 《OpenCv视觉之眼》Python图像处理十六:Opencv图像处理实战一之图像中的硬币检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  5. 《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  6. 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测

    9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 文章目录 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 1 算 ...

  7. Android版OpenCV图像处理技术亲自验证[三]之斑点检测ColorBlobDetector

    Android版OpenCV图像处理技术亲自验证[二]之斑点检测ColorBlobDetector 程序之美 前言 主体 运行效果 构建过程 核心代码 所遇问题 结束语 程序之美 前言 OpenCV是 ...

  8. Python 斑点检测 SimpleBlobDetector

    OpenCV 常用函数 斑点检测 SimpleBlobDetector_create 定义 斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具 ...

  9. Python 图像处理实用指南:1~5

    原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

最新文章

  1. Java刷题知识点之进程和线程的区别
  2. 嵌入式设备web服务器比较
  3. 【PM模块】维护订单基本处理流程——实际操作
  4. 浏览器是如何工作的?(转载)
  5. 封装(私有化成员变量,获取变量值)
  6. 基于随机游走的图嵌入之快速指南
  7. mysql 重置密码 win_window下重置mysql用户密码
  8. UNIX系统命令大全
  9. 青岛理工大学QUT期末考试《电子商务概论》思维导图
  10. 英中繁简编程术语对照
  11. 开源VOSK引擎免费语音转文字部署
  12. VS在新建或者导入项目时出现“不支持此接口(Exception from HRESULT:0x80004002 (E_NONINTERFACE))”的解决办法
  13. 软件工程各阶段的评审内容
  14. Redmi Note 4X adb指令卸载应用
  15. Ubuntu 20.04 修改笔记本亮度
  16. iHerb中国这个app怎么样?iHerb中国邮政EMS与顺丰速运区别点在哪里?
  17. 转发 2013年度电影100佳
  18. iOS、Mac开源项目记录 - From TimLiu-iOS
  19. macOS上如何安装(不需要编译安装或者brew)、使用ffmpeg转码的教程,以及如何使用硬件加速
  20. 管理员使用 Telnet 方式登录设备USG6000

热门文章

  1. 阿里云大数据分析师职业认证
  2. 阿里品牌数据银行分析师认证
  3. 【CSAPP】家庭作业2.77~2.97
  4. 全基因组组装,注释与评估软件
  5. 为什么任何数的0次方都是1
  6. [Excel 与 股票] 一图胜千言之 Excel 处理股票数据
  7. Codeforces Round #570 (Div. 3)B. Equalize Prices
  8. Equalize the Array
  9. oracle对成绩开根号运算,Oracle SQL 之 数学计算-开方根(咋个办呢 zgbn)
  10. 生动形象解释虚数的意义