机器视觉技术分享-Blob分析 含C++ ,python代码说明
Posted _蓝色基因_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器视觉技术分享-Blob分析 含C++ ,python代码说明相关的知识,希望对你有一定的参考价值。
在数字图像处理中,Blob分析是一种基于连通性的图像分析方法,用于检测和分析图像中的连通区域。Blob分析可以用于许多应用,例如目标检测、形状识别、运动跟踪等。
在Blob分析中,一个连通区域被称为一个Blob,它可以由一组相邻的像素组成。Blob的特征通常包括面积、周长、重心、最小外接矩形等。Blob分析的基本步骤包括二值化、连通性分析和特征提取等。
以下是使用C++和OpenCV库实现Blob分析的代码示例:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
// 读取图像
Mat img = imread("blob.jpg", IMREAD_GRAYSCALE);
// 二值化
Mat thresh;
threshold(img, thresh, 127, 255, THRESH_BINARY);
// 连通性分析
Mat labels, stats, centroids;
int num_labels = connectedComponentsWithStats(thresh, labels, stats, centroids);
// 特征提取
for (int i = 1; i < num_labels; i++)
int area = stats.at<int>(i, CC_STAT_AREA);
int x = stats.at<int>(i, CC_STAT_LEFT);
int y = stats.at<int>(i, CC_STAT_TOP);
int w = stats.at<int>(i, CC_STAT_WIDTH);
int h = stats.at<int>(i, CC_STAT_HEIGHT);
double cx = centroids.at<double>(i, 0);
double cy = centroids.at<double>(i, 1);
cout << "Blob " << i << ": area=" << area << ", position=(" << cx << ", " << cy << "), size=(" << w << ", " << h << ")" << endl;
rectangle(img, Point(x, y), Point(x + w, y + h), Scalar(255, 0, 0), 2);
// 显示结果
imshow("Blob Analysis", img);
waitKey(0);
return 0;
以下是使用Python和OpenCV库实现Blob分析的代码示例:
import cv2
# 读取图像
img = cv2.imread('blob.jpg', cv2.IMREAD_GRAYSCALE)
# 二值化
thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]
# 连通性分析
connectivity = 8
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S)
# 特征提取
for i in range(1, num_labels):
area = stats[i, cv2.CC_STAT_AREA]
x, y, w, h = stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP], stats[i, cv2.CC_STAT_WIDTH], stats[i, cv2.CC_STAT_HEIGHT]
cx, cy = centroids[i]
print(f'Blob i: area=area, position=(cx, cy), size=(w, h)')
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Blob Analysis', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像拼接基于matlab机器视觉图像拼接含Matlab源码 2346期
⛄一、小波变换图像融合技术简介
0 引言
每种图像拼接技术都有着不同的优势及场景,很多的数字图像拼接处理技术存在前景断裂、重影鬼影等质量问题,也无法满足人们对高质量视觉需求,基于改进的 SURF 图像匹配算法优化后的缝合线图像拼接方法,建立起一套有效全景图像拼接系统,可解决计算复杂、计算量大和误匹配等问题。
1 图像拼接流程
(1)图像序列输入。对图像数据信息进行采集时,会对后续图像配准精度及融合效果产生影响。多采用相机、手机等图像拍摄工具获取到局部序列图像,要根据摄像位置差异划分发为固定、移动拍摄方式,固定拍摄确保不根据设定好的中心轴来旋转,转旋角度拍摄则无法有效保持重叠区域有效对齐。图像融合采用空间变换使其置于同一平面;移动拍摄可采用平移和自由方式,平移是经过一定间隔并通过水平移动镜头来进行拍摄,自由拍摄不限制拍摄方式,要确保拍摄图像中存在一定比例的重叠区域。
(2)图像预处理。在对图像进行捕获时可能会有非均匀光照等影响因素,导致图像产生模糊、噪声等问题,直接影响着图像匹配精度和效率,可采用图像预处理技术改善图像质量。图像噪声均可通过多种滤波来进行优化与改进。针对图像模糊失真等现象,小波分解会使图像质量得到增强与提升,两幅邻近图象亮度间差异变大会导致融合以后的图像产生进过渡带,拼效以后的效果并没有达到要求,进行拼接融合、颜色校正来提升图像亮度感,也可以优化图像质量。
(3)图像配准。对全景图像进行拼接环节中最重要的就是图像配准,可以得到图像间对应关系,进行转变并形成相同坐标系。图像配准实质上为对变换参数进行求解的全过程,在不同情况下的图像分辨率、灰度值等都存在着较大的不同,通过图像配准可以进一步减小差异性,因此,图像配准精确度会对图像拼接质量产生一定程度的影响。
(4)图像融合。对全景图像拼像最为核心的环节就是图像融合,针对会对图像质量带来很大的影响。图像空间变换是建立起几何变换模型,得到不同像素点间的对应关系,进行图像变换以后可确定出对齐重叠区域,并对重叠区域进行平滑过渡,可以确保视觉的连续性与一致性。
2 图像配准
2.1 频域匹配
通过傅里叶变换把图像函数换转到频域再进行计算,可以得到图像间平移参数。fr(x,y)为参考图像,ft(x,y)为目标图像,两图像在时域空间上应满足要求。
上式中 x0、y0为横、纵轴方向的平移量。
上式中 Fr(u,v)、Ft(u,v)为上面两函数的傅里叶变换。
两图像互功率谱公式为:
对傅里叶进行反变换以后,可得计算出相位函数,如式:
可以在(x0,y0)位置得到最大值,也为平移位置。
采用频域匹配方法不需要太多的计算量,有着很高的精度,但需要待匹配图像存在着较多的重叠区域,图像差异会引起函数能量扩散,会存在着较多的峰尖,无法准确确定出平移矢量。
2.2 匹域匹配
采用灰度信息及模板搜索相互匹配的办法,可建立起重叠区域代价函数,再确定位置参数。可采用平均绝对值、序列相似性等算法。采用区域匹配办法进行改进与优化,可建立起相似性代价函数,有效优化和提升图像匹配效果,不可以使匹配图像亮度存在太大的差异,有着较大的计算量,不可应用于非线性变换。
应用图像典型特征匹配处理办法,应该获取到边缘、轮廓等曲型特征参数,点特征算法有着很好的适用性和较高的鲁棒性,通过特征提取算法来获取到图像中的特征点,通过信息描述可获取到特征点描述子,然后采用匹配方法来建立起不同点间的对应关系,采用变换模型进行计算来确定出参数,两个匹配图像的映射关系就被建立起来。
3 图像融合
3.1 图像空间变换模型
获取到两幅将要进行拼接的图像特征点,根据对应关系建立起两幅图像的映射关系,便可以形成单应性矩阵,通过变换处理手段将处理完成后的图像投射到相同平面,可采用刚性变换模型、投影变换模型等。
3.2 重叠区域融合
全景数字图像可达到的视觉感受情况与重叠区域域融合有着直接的联系,尽量保证重叠区域自然过渡,主要的融合方法有:
(1)线性融合
采用直接平均融合方法,对图像融合重叠区域中每个对应像素点灰度值进行求和再进于平均处理,可用于融合处理以后的像素点灰度值。
上式中 Ir、It为待融合图像的函数,I 为处理后的函数。
对函数表达式进行优化与改进以后,灰度值先进行加权再求得后进行平均处理。
线性融合不需要太复杂的处理流程,也不需要太多的计算理,可应用于对速度有高要求的场所,如果重叠区域无法对齐或具有较多的复杂纹理,进行融合拼接后会存在重影等问题,达不到视觉效果要求。
(2)均值滤波融合
视觉效果不理想可通过非线性处理办法,多用于在重叠区域处理像素点灰度不连续现象。
上式中 IC为图像融合以后重叠区域,(x,y)为中心像素点坐标,s 为像素点邻近区域,N 为像素点个数。
采用均值滤波可解决非均匀光照、残影重影等现象,有利于提升全景图像视觉效果,采用模糊图像处理方式可获取到轮廓、边缘等部位的信息,但可应用的场景并不多。
(3)多分辨率样条融合
把图像分解成多个不同分辨率子图像,再对子图像进行融合,可以把子图像进行逆转换处理为融合图像,具体见图 1所示。
图 1 多分辨率样条融合图
可采用拉普拉斯金字塔融合等办法,是以拉普拉斯塔形结构作为基础的一种算法,对每层都进行融合,以图像分解上的每个频率来对重叠区域进行嘈 合,来对金字塔进行重构。
上式中 LI 为进行融合处理后的拉普拉斯金字塔,LIx、LIt为融合处理以前的金字塔,GR为对重叠区域进行掩膜处理以后的金字塔。
通过金字塔融合可以与线性融合法进行结合,使更多的图像细节得以保留,有效消除图像拼接痕迹,可收于拉普拉斯金字塔需要较大的计算量,还要进行很多处理步骤,并不适用于对拼接速度有着较高要求的场所。小波变换融合与拉普拉斯较为相近,可分解成多个不同频率子图像,还具有更快的处理速度。
(4)泊松融合
结合泊松方程来设计图像拼接融合算法,于梯度最接近位置把融合图像填置于背景图像,进行梯度变化最小值进行。
可对两张图像进行很好地融合,图像拼接部位不明显,可达以对梯度变化一致性的需要,图像中每个像素点都可以采用泊松方程来计算出插值,同样需要较大的计算量,还需要花费较长的时间,但在数据量大、高速度运行的场景中无法使用。
⛄二、部分源代码
clc;
clear all;
close all
img1 = imread(‘left.png’);
img2 = imread(‘right.png’);
img1Dup=rgb2gray(img1);%将img1转化为灰度图像
figure,imshow(img1Dup);
img1Dup=double(img1Dup);
img2Dup=rgb2gray(img2);%将img2转化为灰度图像
figure,imshow(img2Dup);
img2Dup=double(img2Dup);
% 在两幅图像中使用Harris查找角点
[locs1] = Harris(img1Dup);
[locs2] = Harris(img2Dup);
%using NCC to find coorespondence between two images
[matchLoc1 matchLoc2] = findCorr(img1Dup,img2Dup,locs1, locs2);
% use RANSAC to find homography matrix
[H inlierIdx] = estHomography(img1Dup,img2Dup,matchLoc2’,matchLoc1’);
H %#ok
[imgout]=warpTheImage(H,img1,img2);
%imshow(imgout);title(‘final image’);
figure,imshow(uint8(imgout));
imwrite(uint8(imgout), ‘pic_pinjie.jpg’, ‘jpg’);
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]管娜.基于计算机视觉的图像拼接技术研究[J].长江信息通信. 2022,35(07)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
以上是关于机器视觉技术分享-Blob分析 含C++ ,python代码说明的主要内容,如果未能解决你的问题,请参考以下文章
清华&BAAI唐杰团队提出第一个开源的通用大规模预训练文本到视频生成模型CogVideo,含94亿超大参数量!代码即将开源!...