阈值分割c语言(c语言值域)
本篇文章给大家谈谈阈值分割c语言,以及c语言值域对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、sobel算子里的阈值是怎么设的
2、openmv中颜色识别和测距怎么同时实现
3、如何用C语言实现对图像的二值化?
4、C语言解决设置参数阈值问题
5、如何把BMP图片二值化?
6、使用canny算子检测到了边缘后期如何使用阈值分割?
sobel算子里的阈值是怎么设的
sobel算子的阈值指的是其各像素经过偏导计算后得到的grad=fx+fy,对grad进行阈值分割得到边缘的。
由于在sobel算子中加入了权值所以所得的结果会导致所得边缘较宽。
fx=abs(Data[i+1][j-1]+2*Data[i+1][j]+Data[i+1][j+1]-Data[i-1][j-1]-2*Data[i-1][j]-Data[i-1][j+1]);
fy=abs(Data[i-1][j+1]+2*Data[i][j+1]+Data[i+1][j+1]-Data[i-1][j-1]-2*Data[i][j-1]-Data[i+1][j-1]);
上面两个即为加权计算的偏导计算公式。
sobel函数如下:
/***************************************************************
sobel算子
***************************************************************/
void sobel(unsigned char Data[][256],unsigned char xData[])
{
int i,j;
int fx,fy,grad;
for(i=1;i255;i++)
for(j=1;j255;j++)
{
fx=abs(Data[i+1][j-1]+2*Data[i+1][j]+Data[i+1][j+1]-Data[i-1][j-1]-2*Data[i-1][j]-Data[i-1][j+1]);
fy=abs(Data[i-1][j+1]+2*Data[i][j+1]+Data[i+1][j+1]-Data[i-1][j-1]-2*Data[i][j-1]-Data[i+1][j-1]);
grad=fx+fy;
if(grad100)
xData[i*256+j]=255;
else
xData[i*256+j]=0;
}
return;
}
上面的值100即为阈值。
这是本人完成数字图像处理实验的程序,能够运行。
openmv中颜色识别和测距怎么同时实现
openmv中颜色识别和测距同时实现要通过OpenCV将物体通过阈值分割的方式提取出来后,画出物体矩形轮廓,测距时为避免外围物体和其他部分有交叠导致距离不准确的问题,只提取出物体中心的1/2区域进行50个随机采样点测距,并用中值滤波的方式稳定预测结果。OpenMV是一个开源,低成本,功能强大的机器视觉模块。以STM32F767CPU为核心,集成了OV7725摄像头芯片,在小巧的硬件模块上,用C语言高效地实现了核心机器视觉算法,提供Python编程接口。使用者们(包括发明家、爱好者以及智能设备开发商)可以用python语言使用OpenMV提供的机器视觉功能,为自己的产品和发明增加有特色的竞争力。openmv中颜色识别和测距同时实现要通过OpenCV将物体通过阈值分割的方式提取出来后,画出物体矩形轮廓,测距时为避免外围物体和其他部分有交叠导致距离不准确的问题,只提取出物体中心的1/2区域进行50个随机采样点测距,并用中值滤波的方式稳定预测结果。
如何用C语言实现对图像的二值化?
/*************************************************************************
* 该函数用于对图像进行阈值分割运算
* 参数:
* LPSTR lpDIBBits – 指向源DIB图像指针
* LONG lWidth – 源图像宽度(象素数)
* LONG lHeight – 源图像高度(象素数)
************************************************************************/
BOOL ImageChangeProc::ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
//循环变量
long i;
long j;
unsigned char pixel;
long lHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char Threshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue;
//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;
//迭代次数
int IterationTimes;
LONG lLineBytes;
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
lLineBytes = WIDTHBYTES(lWidth * 8);
for (i = 0; i 256;i++)
{
lHistogram[i]=0;
}
//获得直方图
MaxGrayValue = 0;
MinGrayValue = 255;
for (i = 0;i lWidth ;i++)
{
for(j = 0;j lHeight ;j++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
lHistogram[pixel]++;
//修改最大,最小灰度值
if(MinGrayValue pixel)
{
MinGrayValue = pixel;
}
if(MaxGrayValue pixel)
{
MaxGrayValue = pixel;
}
}
}
//迭代求最佳阈值
NewThreshold = (MinGrayValue + MaxGrayValue)/2;
Threshold = 0;
for(IterationTimes = 0; Threshold != NewThreshold IterationTimes 1000;IterationTimes ++)
{
Threshold = NewThreshold;
lP1 =0;
lP2 =0;
lS1 = 0;
lS2 = 0;
//求两个区域的灰度平均值
for (i = MinGrayValue;i =Threshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}
for (i = Threshold+1;iMaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
if(lS1==0||lS2==0)
{
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
return FALSE;
}
Temp1GrayValue = (unsigned char)(lP1 / lS1);
Temp2GrayValue = (unsigned char)(lP2 / lS2);
NewThreshold = (Temp1GrayValue + Temp2GrayValue)/2;
}
//根据阈值将图像二值化
for (i = 0;i lWidth ;i++)
{
for(j = 0;j lHeight ;j++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
if(pixel = Threshold)
{
*lpDst = (unsigned char)0;
}
else
{
*lpDst = (unsigned char)255;
}
}
}
// 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
// 返回
return TRUE;
}
参考:
C语言解决设置参数阈值问题
仅以每次加1为例
0-8可以每次都执行i=(i+1)%9,
2-255可以每次都执行i=(i+1)%254+2,
0-99可以每次都执行i=(i+1)%100
这样就不用加判断了
如何把BMP图片二值化?
bmp图像的二值化有很多种方法,最简单的就是阈值分割
当某像素值阈值 就置像素值为255
当某像素值阈值 就置像素值为0
这个时候还得确定你处理的bmp图像是多少bits的,一般情况下处理24位的居多,我这有一个用C语言写的图像二值化的程序,如果想要的话,把邮箱留一下,发给你。
使用canny算子检测到了边缘后期如何使用阈值分割?
不是空的,赋值的时候出错了,我改了一点,不知道对你有用没。。 % clear;close all I=imread(‘1.jpg’);%读入原始jpg格式图像 figure plot(1,1) imshow(I) W=size(I,2); %得到图像高度 I1=rgb2gray(I);%将原图像转化为灰度图象 figure;subplot(221); imshow(I1);title(‘灰度图像’); I2=medfilt2(I1);%滤波默认窗口为[3,3] subplot(222);imshow(I2);title(‘中值滤波结果’); I3=filter2(fspecial(‘average’,3),I1)/255; %模板尺寸为3 subplot(223);imshow(I3);title(‘均值滤波结果’); I4=wiener2(I1,[3 3]); %对图像进行二维自适应维纳滤波 subplot(224);imshow(I4); title(‘自适应滤波结果’); J=[I1,I2,I3,I4];%这里的矩阵为什么是空的? for j=1:4; Ij=J(:,1+W*(j-1):W*j); %%给Ij赋值 BW1=edge(Ij,’prewitt’);%边缘检测 BW2=edge(Ij,’canny’); BW3=edge(Ij,’log’); BW4=edge(Ij,’sobel’); figure; subplot(221);imshow(BW1);title(‘prewitt算子’); subplot(222);imshow(BW2);title(‘canny算子’); subplot(223);imshow(BW3);title(‘laplacian算子’); subplot(224);imshow(BW4);title(‘sobel算子’); end figure;subplot(121);imhist(I1);title(‘灰度直方图’);%观察灰度直方图, 灰度200处有谷,确定阈值T=200 I5=im2bw(I1,220/255); % im2bw函数需要将灰度值转换到[0,1]范围内 subplot(122);imshow(I5);title(‘直方图阈值分割效果’);
阈值分割c语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言值域、阈值分割c语言的信息别忘了在本站进行查找喔。
以上是嗨壳技术分享网(www.heikehao.com)小编对“ 阈值分割c语言(c语言值域) ”的详细解答,希望能够帮助到大家。
原创文章,作者:语言我知,如若转载,请注明出处:https://www.heikehao.com/139.html