当前位置:首页 > 代码 > 正文

图像检测代码(图像检测技术)

admin 发布:2022-12-19 20:05 152


本篇文章给大家谈谈图像检测代码,以及图像检测技术对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

matlab图像分块,边缘检测,图像拼接代码

你可以试试下面的程序:

I=imread('myphoto.jpg'); % 假设要处理的图像是myphoto.jpg

heights=size(I,1); % 图像的高

widths=size(I,2); % 图像的宽

m=8; % 假设纵向分成8幅图

n=10; % 假设横向分成10幅图

% 考虑到rows和cols不一定能被m和n整除,所以对行数和列数均分后要取整

rows=round(linspace(0,heights,m+1)); % 各子图像的起始和终止行标

cols=round(linspace(0,widths,n+1)); % 各子图像的起始和终止列标

blocks=cell(m,n); % 用一个单元数组容纳各个子图像

for k1=1:m

for k2=1:n

blocks{k1,k2}=I(rows(k1)+1:rows(k1+1),cols(k2)+1:cols(k2+1),:);

subimage=blocks{k1,k2};

% 以下是对subimage进行边缘检测

% 加入边缘检测的代码

% 以上是对subimage进行边缘检测

blocks{k1,k2}=subimage;

end

end

processed=I; % processed为处理后的图像,用原图像对其初始化

% 以下为拼接图像

for k1=1:m

for k2=1:n

processed(rows(k1)+1:rows(k1+1),cols(k2)+1:cols(k2+1),:)=blocks{k1,k2};

end

end

figure,imshow(processed)

% 以上的程序已测试过,对灰度图像和真彩图像都可以运行。

哪位大哥给个 图像边缘检测 C++程序代码

将常用的检测实现公式列出如下:

Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;

Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|

+|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;

拉普拉斯算子:G[I,j]=|f[i+1,j]+f[i-1,j]+f(i,j+1)+f[i,j-1]-4f[i,j]|;

其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。

不过用robert算法实现的没有找到具体的源代码,下面有一个Sobe算子实现的:

在视图类中定义的响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数:

void CDibView::OnMENUSobel()

//灰度图像数据的获得参见天极网9.10日发表的拙作//VC数字图像处理一文

{

HANDLE data1handle;

LPBITMAPINFOHEADER lpBi;

CDibDoc *pDoc=GetDocument();

HDIB hdib;

unsigned char *hData;

unsigned char *data;

hdib=pDoc-m_hDIB;

BeginWaitCursor();

lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);

hData= lpbi +* (LPDWORD)lpbi + 256*sizeof(RGBQUAD);

//得到指向位图像素值的指针

pDoc-SetModifiedFlag(TRUE);//设修改标志为"TRUE"

data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi-biWidth*8)*lpBi-biHeight);

//申请存放处理后的像素值的缓冲区

data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);

AfxGetApp()-BeginWaitCursor();

int i,j,buf,buf1,buf2;

for( j=0; jbiHeight; j++)//以下循环求(x,y)位置的灰度值

for( i=0; ibiWidth; i++)

{

if(((i-1)=0)((i+1)biWidth)((j-1)=0)((j+1)biHeight))

{//对于图像四周边界处的向素点不处理

buf1=(int)*(hData+(i+1)*WIDTHBYTES(lpBi-biWidth*8)+(j-1))

+2*(int)*(hData+(i+1)*WIDTHBYTES(lpBi-biWidth*8)+(j))

+(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi-biWidth*8)+(j+1));

buf1=buf1-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi-biWidth*8)+(j-1))

-2*(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi-biWidth*8)+(j))

-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi-biWidth*8)+(j+1));

//x方向加权微分

buf2=(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi-biWidth*8)+(j+1))

+2*(int)(int)*(hData+(i)*WIDTHBYTES(lpBi-biWidth*8)+(j+1))

+(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi-biWidth*8)+(j+1));

buf2=buf2-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi-biWidth*8)+(j-1))

-2*(int)(int)*(hData+(i)*WIDTHBYTES(lpBi-biWidth*8)+(j-1))

-(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi-biWidth*8)+(j-1));

//y方向加权微分

buf=abs(buf1)+abs(buf2);//求梯度

if(buf255) buf=255;

if(buf0)

else *(data+i*lpBi-biWidth+j)=(BYTE)0;

}

for( j=0; jbiHeight; j++)

for( i=0; ibiWidth; i++)

*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi-biWidth*8)+j);

//处理后的数据写回原缓冲区

AfxGetApp()-EndWaitCursor();

GlobalUnlock((HGLOBAL)hdib);

GlobalUnlock(data1handle);

GlobalFree(date1handle);

EndWaitCursor();

Invalidate(TRUE);

}

具体的分析给你一个链接吧:

求图像边缘检测 VC++程序代码

Roberts算子边缘检测代码:

void Roberts(BYTE *dst,BYTE *src,int width,int height)

{

int A, B; // A(x-1, y-1) B(x, y-1)

int C, D; // C(x-1, y) D(x, y)

int x;

int y;

for (x = 0; x width; x++)

{

*dst = 0;

dst++;

}

// 指向第一行

src += width;

// 不处理最上边和最左边

for (y = 1; y height; y++)

{

// 指向每行第一列

*dst = 0;

src++;

dst++;

for (x = 1; x width; x++)

{

A = *(src - width - 1);

B = *(src - width);

C = *(src - 1);

D = *src;

int temp = (int)(sqrt((A - D) * (A - D) + (B - C) * (B - C)));

// 越界判断 0 -- 255

if(temp = 255)

{

*dst = 255;

}

else

{

*dst = (BYTE)temp;

}

src++;

dst++;

} // x

} // y

return;

} // end of Roberts

matlab图像如何用代码完成图像的分割、边缘检测和拼接的任务?

你可以试试下面的程序:\x0d\x0aI=imread('myphoto.jpg'); % 假设要处理的图像是myphoto.jpg\x0d\x0aheights=size(I,1); % 图像的高\x0d\x0awidths=size(I,2); % 图像的宽\x0d\x0am=8; % 假设纵向分成8幅图\x0d\x0an=10; % 假设横向分成10幅图\x0d\x0a% 考虑到rows和cols不一定能被m和n整除,所以对行数和列数均分后要取整\x0d\x0arows=round(linspace(0,heights,m+1)); % 各子图像的起始和终止行标\x0d\x0acols=round(linspace(0,widths,n+1)); % 各子图像的起始和终止列标\x0d\x0ablocks=cell(m,n); % 用一个单元数组容纳各个子图像\x0d\x0afor k1=1:m\x0d\x0a for k2=1:n\x0d\x0a blocks{k1,k2}=I(rows(k1)+1:rows(k1+1),cols(k2)+1:cols(k2+1),:);\x0d\x0a subimage=blocks{k1,k2};\x0d\x0a % 以下是对subimage进行边缘检测\x0d\x0a % 加入边缘检测的代码\x0d\x0a % 以上是对subimage进行边缘检测\x0d\x0a blocks{k1,k2}=subimage;\x0d\x0a end\x0d\x0aend\x0d\x0aprocessed=I; % processed为处理后的图像,用原图像对其初始化\x0d\x0a% 以下为拼接图像\x0d\x0afor k1=1:m\x0d\x0a for k2=1:n\x0d\x0a processed(rows(k1)+1:rows(k1+1),cols(k2)+1:cols(k2+1),:)=blocks{k1,k2};\x0d\x0a end\x0d\x0aend\x0d\x0afigure,imshow(processed)\x0d\x0a% 以上的程序已测试过,对灰度图像和真彩图像都可以运行。

关于图像检测代码和图像检测技术的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/22092.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载