图像处理 如何检测矩形_图像处理用矩形框扫描图像 - CSDN
  • 图像处理,特征矩形检测

    千次阅读 2018-04-24 10:03:09
    就像这样识别中间矩形框的位置并测出里面的凹槽长度,我写了一点代码,能够自动识别匹配矩形框位置,并完成边缘检测,像素点计数,从而达到测量长度的目的。如下图主函数:im1=imread('[1]{1}20151008161427.jpg'); ...
            今天老师交代了一道题,要识别图像中的一个凹槽中的边缘的长度,本来我以为,这有什么难的,后来明白是我想简单了,这里面需要注意的地方有很多。就像这样识别中间矩形框的位置并测出里面的凹槽长度,我写了一点代码,能够自动识别匹配矩形框位置,并完成边缘检测,像素点计数,从而达到测量长度的目的。如下图
    主函数:
    im1=imread('[1]{1}20151008161427.jpg');         %读取图片
    countpix=Line_measursment(im1);                  %对二值图像进行像素点计数
    disp(countpix);
    直线测量函数:
    function count=Line_measursment(picture)
    [im2]=tatget_my(picture);   %自动提取感兴趣的区域
    imshow(im2);                
    BW = edge(im2,'canny');                         %边缘提取
    BW_deal=deal_picture(BW);                       %运用形态学的方法去掉图片中的小块区域
    imshow(BW_deal);
    count=count_pixel(BW_deal);
    目标图像切割:
    function target=target_cut(picture,x,y)
    target=picture(x:x+35,y:y+35);
    获取感兴趣的区域函数:
    function [picture_cut]=tatget_my(picture)
    picture_cut=picture;
    yuzhi=250;
    [b,c]=size(picture);%获取图像的大小也就是宽和高
    for i=1:c
        for j=1:b
            if (picture(j,i)>=yuzhi)
                picture(j,i)=255;
            end
            if(picture(j,i)<yuzhi)
                picture(j,i)=0;
            end
        end
    end
    for i=1:c-1
        for j=1:b
            if ((picture(j,i)-picture(j,i+1))==255)
                temp=j;
                count=0;
                while((picture(temp,i)-picture(temp,i+1))==255)
                         count=count+1;
                         if(count>30)
                             startpointy=j;
                             startpointx=i;
                             picture_cut=picture_cut(startpointy:startpointy+35,startpointx:startpointx+35);
                             return;
                         end
                         temp=temp+1;
                end
            end
        end
    end

    去掉边缘提取中小的像素点函数:

    function picture_deal=deal_picture(picture)
    BW=bwmorph(picture,'dilate');
    BW2 = bwareaopen(BW,80);
    picture_deal=bwmorph(BW2,'erode');
    return;

    测量像素点个数的函数:


    function [countpix]=count_pixel(picture)[b,c]=size(picture);
      countpix=0;
    for i=1:b 
      for j=1:c 
         if(picture(j,i)==1) countpix=countpix+1; 
         end 
      end
    end
    return;


    通过上面的函数就能较好的测出图像中的凹槽像素点个数,从而长度也就能知道了。这里面我的滤波没有用用现成的滤波函数,运用的是形态学滤波。


    展开全文
  • 判断图像中的三角形,圆形和矩形

    万次阅读 多人点赞 2017-08-08 18:03:22
    下面稍微介绍一下我自己的处理方法: 1.首先是将彩色变灰度。 2.因为图片含有边框,所以首先对边框进行处理,将边框去除。 去除后的图形如图3. 可以看到边上的圆有点变形,不过不影响形状的判断, 只是会影响

    这是我自己做作业的时候写的一点东西,判断一张图片中的形状(图片如下,放到其他图片的话可能就不适用了),所以仅供参考,自己水平确实比较低,希望大家不喜勿喷~

    我们使用的图片如下:

    这里写图片描述
    结果如下:
    这里写图片描述

    下面稍微介绍一下我自己的处理方法:
    1.首先是将彩色变灰度。
    2.因为图片含有边框,所以首先对边框进行处理,将边框去除。 去除后的图形如图3. 可以看到边上的圆有点变形,不过不影响形状的判断,
    只是会影响质心位置的计算。
    这里写图片描述
    3. 为了计算质心。 先对图形进行边缘提取,然后计算每块区域所有点的位置坐标平均值,即质心坐标
    4.计算每块区域边缘点到质心的距离,进行曲线拟合。根据极点的数目判断图形的形状。
    5.把区域的形状标在图片中

    我的matlab代码

    
    f4=imread('Project2016.jpg');     %读取图像 
    imshow(f4)
    a=rgb2gray(f4);          %将彩色图像转换成灰度图像
    a_size = size(a);
    b = ones(a_size);
    
    for i =1:a_size(1)
        for j = 1:a_size(2)
            if a(i,j)>=0 && a(i,j)<=50
                b(i,j)=0;
            end
        end
    end
    
    
    
    B =[1 1 1 1;1 1 1 1;1 1 1 1;1 1 1 1];  %此模板的选择有待再考虑
    b = imerode(b,B);
    
    for i =1:a_size(1)
        for j = 1:a_size(2)
            if  b(i,j)==0
                a(i,j)=255;
            end
        end
    end
    imshow(a)
    
    bw=edge(a,'prewitt');     %边缘检测   边缘检测结束后发现还是有一些鼓励的小点,不多它们没有形成闭合的曲线
    [L,num] = bwlabel(bw);               %这里已经给每个区域标好号了,使用bwlabel的话会把鼓励的不成闭合曲线的点也算进去
    %一些独立点的像素数量是比较少的,所以可以通过检测每一块区域的像素点大小来决定是不是要删除此像素块
    for i= 1:num
            [r,c]=find(L==i);
            size_L = size([r,c]);
            if size_L(1,1)<30
                L(r,c)=0;
            end
    end
    L = logical(L);
    
    se = strel('disk',4);   %创造一个平坦的圆盘型结构元素,其半径为2
    L = imclose(L,se);    %关闭图像
    [L,num1] = bwlabel(L);
    L = rot90(L,3);
    L = fliplr(L);
    pixel = cell([num1,1]);
    centre = zeros(num1,2);
    size_L = size(L);
    for i=1:num1
    
        [r,c]=find(L==i);
        pixel{i} = [r,c]; 
        hold on
        mean_pixel = mean(pixel{i});
        centre(i,:) = mean_pixel;         
        plot(mean_pixel(1,1),mean_pixel(1,2),'r*')
        size_r = size(r);
        distance = zeros(size_r);
        for j = 1:1:size_r(1)
                distance(j) = sqrt((r(j)-mean_pixel(1))^2 + (c(j)-mean_pixel(2))^2);
        end
        p=polyfit((1:size_r(1))',distance,7);
        x = (1:size_r(1))';
        y = p(1)*x.^7 + p(2)*x.^6 + p(3)*x.^5 + p(4)*x.^4 + p(5)*x.^3 + p(6)*x.^2 + p(7)*x.^1 + p(8);
        %plot(x,y)            %对数据进行拟合,因为数据过于杂乱,不好判断    
        min_distance = min(distance);
        max_distance = max(distance);
        min_y        =  min(y);
        max_y        =  max(y);
        num_peaks    =  size(findpeaks(-y));
        if (max_distance - min_distance)<= 15 && (max_y - min_y) <= 15
            text(mean_pixel(1,1),mean_pixel(1,2),sprintf('圆形  %d',i))
        elseif num_peaks(1) == 2
            text(mean_pixel(1,1),mean_pixel(1,2),sprintf('三角形  %d',i))    
        else
            text(mean_pixel(1,1),mean_pixel(1,2),sprintf('矩形  %d',i))
        end    
    end
    
    %}

    我的博客: www.wangs0622.com

    展开全文
  • 矩形度体现物体对其外接矩形的充满程度,反映一个物体与矩形相似程度的一个参数 是矩形拟合因子。 其中,S0是该物体的面积,而SMER是其最小外接矩形的曲积。R反映了一个物体对其的充满程度。对于矩形物体R取得...

    矩形度体现物体对其外接矩形的充满程度,反映一个物体与矩形相似程度的一个参数
    是矩形拟合因子。
    这里写图片描述

    其中,S0是该物体的面积,而SMER是其最小外接矩形的曲积。R反映了一个物体对其的充满程度。对于矩形物体R取得最大值1,对于圆形物体R取值为 ,对于纤细、弯曲的物体R取值变小。矩形拟合因子的值为0~1。

    另一个与形状有关的特征是长宽比:
    这里写图片描述

    它是最小外接矩形的宽与长的比值。这个特征可以把较纤细的物体与方形或圆形物体区分开。

    展开全文
  • 使用OpenCV检测图像中的矩形

    千次阅读 2019-07-13 17:03:07
    1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现。 2.我这里使用的OpenCV版本是3.30. 矩形检测 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘。 (2)分离图像通道,并检测边缘。 (3...

    前言

    1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现。
    2.我这里使用的OpenCV版本是3.30.

    矩形检测

    1.得到原始图像之后,代码处理的步骤是:
    (1)滤波增强边缘。
    (2)分离图像通道,并检测边缘。
    (3) 提取轮廓。
    (4)使用图像轮廓点进行多边形拟合。
    (5)计算轮廓面积并得到矩形4个顶点。
    (6)求轮廓边缘之间角度的最大余弦。
    (7)画出矩形。
    2.代码

    //检测矩形
    //第一个参数是传入的原始图像,第二是输出的图像。
    void findSquares(const Mat& image,Mat &out)
    {
    	int thresh = 50, N = 5;
    	vector<vector<Point> > squares;
    	squares.clear();
    
    	Mat src,dst, gray_one, gray;
    
    	src = image.clone();
    	out = image.clone();
    	gray_one = Mat(src.size(), CV_8U);
    	//滤波增强边缘检测
    	medianBlur(src, dst, 9);
    	//bilateralFilter(src, dst, 25, 25 * 2, 35);
    
    	vector<vector<Point> > contours;
    	vector<Vec4i> hierarchy;
    
    	//在图像的每个颜色通道中查找矩形
    	for (int c = 0; c < image.channels(); c++)
    	{
    		int ch[] = { c, 0 };
    
    		//通道分离
    		mixChannels(&dst, 1, &gray_one, 1, ch, 1);
    
    		// 尝试几个阈值
    		for (int l = 0; l < N; l++)
    		{
    			// 用canny()提取边缘
    			if (l == 0)
    			{
    				//检测边缘
    				Canny(gray_one, gray, 5, thresh, 5);
    				//膨脹
    				dilate(gray, gray, Mat(), Point(-1, -1));
    				imshow("dilate", gray);
    			}
    			else
    			{
    				gray = gray_one >= (l + 1) * 255 / N;
    			}
    
    			// 轮廓查找
    			//findContours(gray, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
    			findContours(gray, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
    
    			vector<Point> approx;
    			
    			// 检测所找到的轮廓
    			for (size_t i = 0; i < contours.size(); i++)
    			{
    				//使用图像轮廓点进行多边形拟合
    				approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);
    
    				//计算轮廓面积后,得到矩形4个顶点
    				if (approx.size() == 4 &&fabs(contourArea(Mat(approx))) > 1000 &&isContourConvex(Mat(approx)))
    				{
    					double maxCosine = 0;
    
    					for (int j = 2; j < 5; j++)
    					{
    						// 求轮廓边缘之间角度的最大余弦
    						double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
    						maxCosine = MAX(maxCosine, cosine);
    					}
    
    					if (maxCosine < 0.3)
    					{
    						squares.push_back(approx);
    					}
    				}
    			}
    		}
    	}
    
    	
    	for (size_t i = 0; i < squares.size(); i++)
    	{
    		const Point* p = &squares[i][0];
    
    		int n = (int)squares[i].size();
    		if (p->x > 3 && p->y > 3)
    		{
    			polylines(out, &p, &n, 1, true, Scalar(0, 255, 0), 3, LINE_AA);
    		}
    	}
    	imshow("dst",out);
    }
    
    static double angle(Point pt1, Point pt2, Point pt0)
    {
    	double dx1 = pt1.x - pt0.x;
    	double dy1 = pt1.y - pt0.y;
    	double dx2 = pt2.x - pt0.x;
    	double dy2 = pt2.y - pt0.y;
    	return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
    }
    

    3.运行结果
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 检测和方形检测图像处理

    热门讨论 2020-07-30 23:33:35
    用MFC编程实现界面,Hough变换实现圆的检测,和方形(也即平行线)的检测,压缩包里包括文档,可执行文件,源码,图像
  • 一幅正常图像,要求以左上角为中心逆时针旋转10度,然后把倾斜的矩形图像,变成平行四边形。 矩形变成平行四边形怎么变?此时图像因为以左上角为中心旋转已经丢失了部分信息,变成平行四边形怎么变。 clear ;close ...
  • 近期由于项目需要,需要使用python的opencv库处理图像,在下面的代码中使用了很多cv2的库函数,对这些函数进行了封装,可以直接拷贝调用.项目地址 该部分有两个文件构成 main.py 和 replace.py 运行...
  • 有时候图像中拍的海报,视频,文件等因为拍摄角度问题,结果在图像中显示为任意四边形。该程序提供了一种将这个任意四边形转换为矩形的方法
  • 我的图像处理的一个作业。 1.任务 PCB图的直线提取 2.使用平台 Windows10专业版 VS2015企业版 C++ opencv3.2 3.图像处理的思路 第一部分:图像的前期处理。 二值化、滤波、形态学操作等等 第二部分:直线检测与标记...
  • 数字图像处理--图像锐化和边缘检测

    万次阅读 2018-09-14 10:10:52
     1、图像锐化和边缘检测的基本概念,微分梯度已经差分的定义  2、锐化和边缘检测的像素处理方式(3种)  3、单方向一阶微分锐化,包括:  水平方向  垂直方向  Kirsch算子  4、无方向微分锐化,包括: ...
  • 数字图像处理期中学习报告

    千次阅读 2018-09-07 19:26:28
    数字图像处理数字图像处理 一学习内容总结 第一章 绪论 1 什么是数字图像处理 2 使用数字图像处理领域的实例 3 数字图像处理的基本步骤 4 图像处理系统的组成 第二章 数字图像处理基础 1 视觉感知要素 2 光和电磁...
  • 图像处理-椭圆检测

    千次阅读 2019-05-16 10:11:18
    边界聚类椭圆检测算法经典椭圆检测方法投票(聚类)方法随机hough变换椭圆检测算法最优化方法基于弧段的方法边界聚类算法流程预处理边界像素连接线段列提取线段列旋转方向统一凹点和角点检测圆弧聚类再配对直接最小...
  • 图像处理之图像的边缘、轮廓检测

    万次阅读 2017-06-17 15:49:18
    图像的边缘、轮廓检测在人类视觉和计算机视觉中均起着重要的作用。人类能够仅凭一张背景剪影或一张草图就能识别出物体的类型和姿态。OpenCV提供了许多边缘检测l滤波函数,包括Laplacian( )、Sobel()以及Scharr()...
  • matlab图像检测处理——图形检测

    万次阅读 2018-09-03 08:49:06
    本博客仅仅是因为自己经常忘记,记笔记而已 常用操作: 1、二值化 clc A=imread('a.jpg'); %读取到一张图片 ... %对图像二值化 figure(1) imshow(A) %显示二值化之前的图片 figure(2) ims...
  • 数字图像处理的技术方法和应用

    万次阅读 2016-11-18 10:56:01
    所谓数字图像处理,是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。20 世纪 50 年代,电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息,这便是早期的图像处理。早期图像处理...
  • 数字图像处理是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。图像处理最早出现于 20 世纪 50 年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为...
  • 图像处理】简单的车牌识别

    千次阅读 2019-05-25 16:29:15
    前段时间刚刚把毛星云的OpenCV大体上过完了一遍,所以找了个图像处理的小项目练练手。 研一的时候做过车牌识别的小demo,当时对图像处理的一些方法的理解还不是很深刻。 在网上浏览学习了以后,参考学习了图像处理...
  • 基于HOUGH变换的矩形检测

    万次阅读 2006-04-15 14:30:00
    基于HOUGH变换的矩形检测作者: cndg 2006-03-02在图像中查找直线、圆、椭圆的方法很多,网上也有很多类似的源代码。但是介绍矩形(正方形,长方形)查找的方法很少,本文介绍基于HOUGH变换的矩形检测。1、 ...
  • OpenCV3基础——几种基本的图像处理

    万次阅读 多人点赞 2019-03-12 18:56:36
    虽然单单要做车牌号识别的话不需要特别多种类的图像处理,但是我们不能只是为了这么一个目标去学习,所以这次就讲一些OpenCV里基本的图像处理,大家以后可以根据需求使用不同的图像处理。 一、图像显示 这一步在...
  • 请听题,请检测如下线段长度,已知dx=0.0215; 第一种方法,CvBoundingRect /* *函数名:cvBoundingRect *输入参数:points:可以是数组,也可以是cvSeq *返回值:CvRect :轮廓的最小包围矩形 */ CvRect ...
1 2 3 4 5 ... 20
收藏数 60,326
精华内容 24,130
关键字:

图像处理 如何检测矩形