本文最后更新于:14 天前

简单描述

【简单描述符】

  • 区域面积:区域包含的像素数

  • 区域重心:

    区域重心

注意:区域重心可能不是整数。

【形状描述符】

  • 形状参数

    形状参数

    注意:形状为圆形时:F=1;形状为其他时,F>1

  • 偏心率:等效椭圆宽高比。

  • 欧拉数:$E = C-H$

  • 圆形性:

    圆形性

一般化描述

  • 最小包围矩形(MER)

    mer

  • 方向和离心率

    方向和离心率

不变矩

  • 首先定义归一化的中心矩

    图像f(x,y)的p+q阶矩定义为:

    1

    f(x,y)的p+q阶中心矩定义为:

    2

    其中:

    3

    即前面定义的重心。

    f(x,y)的归一化中心矩定义为:

    4

  • 然后定义不变矩

    常用的有七个不变矩,即对平移、旋转和尺度变化保持不变。这些可由归一化的二阶和三阶中心矩得到:

    6

  • 计算示例

    计算示例

图像特征描述总结

  1. 区域的基本特征包括面积、质心、圆形性等.
  2. 最小包围矩形和多边形拟合能有效的描述区域形状
  3. 七个不变矩特征可以有效的度量区域形状,对平移、旋转和比例放缩变换不敏感

代码实例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/1/16 16:39
# @Author  : Seven
# @File    : featureDescription.py
# @Software: PyCharm
import cv2

# 加载图片
img = cv2.imread('rice.png')
cv2.imshow('source', img)
# 转换为灰度图
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 形态学处理--五次开运算
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
morphImage_open = cv2.morphologyEx(grayImage, cv2.MORPH_OPEN, kernel, iterations=5)
# 原图减去背景图
riceImage = grayImage - morphImage_open
# 大津算法阈值化
thresholdImage = cv2.threshold(riceImage, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 图像分割
partition = cv2.findContours(thresholdImage[1], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
count = 0
for i in partition[1]:
    area = cv2.contourArea(i)
    # print("area:", area)
    if area <= 10:
        continue
    else:
        count += 1
        print("blob:{}:{}".format(count, area))
        # 得到米粒的坐标--x、y、w、h
        rect = cv2.boundingRect(i)
        # 在img中画出最大面积米粒
        cv2.drawContours(img, [i], -1, (255, 255, 0), 1)
        cv2.rectangle(img, (rect[0], rect[1]), (rect[0]+rect[2], rect[1]+rect[3]),  (0, 0, 255), 1)
        cv2.putText(img, str(count), (rect[0], rect[1]), cv2.FONT_HERSHEY_PLAIN, 0.5, (0, 255, 0))

print("米粒数量:%s" % count)
cv2.imshow("area", img)
cv2.waitKey(0)


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

【八】图像分割 上一篇
【六】直方图 下一篇