提取图片中目标物轮廓的像素尺寸

1.导入数据库

import cv2
import numpy as np
from PIL import Image

2.导入图片

image_tif = Image.open('1.tif')  #导入tif图像
image_tif.convert('RGB').save('1p.png','PNG') # 转换为png格式
image = cv2.imread('1p.png') #读取png图像

3.转化为灰度图

# 将图片转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊,减少噪声
blur = cv2.GaussianBlur(gray, (5, 5), 0)

4.二值化处理

# 二值化处理
ret, thresh = cv2.threshold(blur, 180, 255, cv2.THRESH_BINARY)

5.寻找目标物轮廓

# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #检测所有轮廓,建立树状结构关系;保存水平、垂直或对角线的端点
#contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #检测所有轮廓,但不建立层次关系;保存轮廓上所有的点

# 遍历轮廓
for cnt in contours:
    # 计算轮廓的边界框
    x, y, w, h = cv2.boundingRect(cnt)
    
    # 计算轮廓的面积
    area = cv2.contourArea(cnt)
    
    # 根据需要的条件过滤轮廓(例如,面积大小)
    if area > 10000 and area < 20000:  # 根据面积筛选目标物
        # 绘制轮廓的边界框
        cv2.rectangle(thresh, (x, y), (x+w, y+h), (0, 0, 255), 2)
        
        # 打印尺寸
        print(f"Object width: {w}, Object height: {h}")

# 显示图片
cv2.imshow('Detected Objects', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.结果展示

image

结果展示: Object width: 111, Object height: 140

完整代码
import cv2
import numpy as np
from PIL import Image


# 读取图片
#image = cv2.imread('1.tif')

image_tif = Image.open('1.tif')  #导入tif图像
image_tif.convert('RGB').save('1p.png','PNG') # 转换为png格式
image = cv2.imread('1p.png') #读取png图像

# 将图片转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用高斯模糊,减少噪声
blur = cv2.GaussianBlur(gray, (5, 5), 0)


# 二值化处理
ret, thresh = cv2.threshold(blur, 180, 255, cv2.THRESH_BINARY)

# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #检测所有轮廓,建立树状结构关系;保存水平、垂直或对角线的端点
#contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #检测所有轮廓,但不建立层次关系;保存轮廓上所有的点

# 遍历轮廓
for cnt in contours:
    # 计算轮廓的边界框
    x, y, w, h = cv2.boundingRect(cnt)
    
    # 计算轮廓的面积
    area = cv2.contourArea(cnt)
    
    # 根据需要的条件过滤轮廓(例如,面积大小)
    if area > 10000 and area < 20000:  # 根据面积筛选目标物
        # 绘制轮廓的边界框
        cv2.rectangle(thresh, (x, y), (x+w, y+h), (0, 0, 255), 2)
        
        # 打印尺寸
        print(f"Object width: {w}, Object height: {h}")

# 显示图片

cv2.imshow('Detected Objects', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
posted @ 2024-11-20 21:56  塞外声  阅读(15)  评论(0编辑  收藏  举报