opencv 对象计数

在这里插入图片描述
在这里插入图片描述

#include <QCoreApplication>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;
//对象计数

int main()
{

    src=imread("../image/13.png");
    if(src.empty())
    {
        printf("could not load image ...");
        return ;
    }
    imshow("src",src);

    cvtColor(src,gray,CV_BGR2GRAY);
 imshow("gray",gray);
    Mat binary;
    //二值化
    threshold(gray,binary,0,255,THRESH_BINARY|THRESH_TRIANGLE);

    imshow("output",binary);
    //形态学操作
    Mat kernel=getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
    //腐蚀操作
   dilate(binary,binary,kernel,Point(-1,-1),1);
   imshow("output1",binary);

   // 距离变换
   Mat dist;
   bitwise_not(binary,binary);
   //距离变换函数
   distanceTransform(binary,dist,CV_DIST_L2,3);
   //归一化操作
    normalize(dist,dist,0,1.0,NORM_MINMAX);
   imshow("output2",dist);
   Mat dst;
   // threshold(dist,dst,0.6,1.0,THRESH_BINARY);
   //阈值化二值分割
   Mat dist_8u;
   dist.convertTo(dist_8u,CV_8U);

   adaptiveThreshold(dist_8u,dist_8u,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,85,0.0);

   dilate(dist_8u,dist_8u,kernel,Point(-1,-1),2);
//   normalize(dist_8u,dist_8u,0,1.0,NORM_MINMAX);
    imshow("output3",dist_8u);


//连通区域技术
    vector<vector<Point>> contours;
    findContours(dist_8u,contours,CV_RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);

    //draw result
    Mat markers=Mat::zeros(src.size(),CV_8UC3);
    RNG rng(12345);

    for(int i=0;i<contours.size();i++)
    {

        drawContours(markers,contours,i,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1,8,Mat());
        Rect rect=boundingRect(contours[i]);
        string str=to_string(i+1);
        double area=contourArea(contours[i]);
        printf("%d号玉米的面积是%2f\n",i+1,area);
        putText(markers,str,Point(rect.x,rect.y),CV_FONT_NORMAL,0.5,Scalar(0,0,255),1,8,0);
    }

    printf("玉米有%d粒\n",contours.size());
    imshow("markers",markers);
    waitKey(0);
    return 0;
}

在这里插入图片描述

### 使用 OpenCV 实现细胞计数的图像处理技术 #### 加载必要库 为了实现细胞计数,首先需要导入必要的 Python 库。这包括 `cv2` 和 `numpy`。 ```python import cv2 import numpy as np ``` 加载待处理的图像文件同样重要。通过调用 `cv2.imread()` 方法可以完成此操作[^2]: ```python img = cv2.imread('cells_image.jpg') ``` #### 预处理阶段 预处理对于提高后续检测准确性至关重要。通常涉及灰度转换、模糊化减少噪声影响以及二值化设定阈值区分前景背景等步骤。 ```python gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) _, thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) ``` #### 细胞轮廓提取与过滤 利用形态学运算改善二值图质量,并找到所有封闭区域即潜在目标对象;接着基于面积大小筛选符合条件的真实细胞个体。 ```python kernel = np.ones((3, 3), dtype=np.uint8) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) sure_bg = cv2.dilate(opening, kernel, iterations=3) dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5) ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0) sure_fg = np.uint8(sure_fg) unknown = cv2.subtract(sure_bg, sure_fg) contours, _ = cv2.findContours(sure_fg.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:] filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area_threshold] ``` 这里假设已经定义了一个最小面积阈值变量 `min_area_threshold` 来排除那些过小而不可能是实际细胞的对象[^3]。 #### 计算并标注数量 最后一步是对每一个合格的连通域计算质心位置,在原图对应处标记编号从而直观展示统计结果。 ```python for idx, contour in enumerate(filtered_contours): moments = cv2.moments(contour) cx = int(moments['m10'] / moments['m00']) cy = int(moments['m01'] / moments['m00']) cv2.putText(img, f"{idx + 1}", (cx - 10, cy), cv2.FONT_HERSHEY_SIMPLEX, .5, (0, 0, 255), 2) ``` 上述过程实现了基本功能需求,当然还可以进一步优化算法参数设置以适应不同类型的样本图片特性[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值