王朝知道
分享
 
 
 

ASP.NET 或 PHP 图象高手来

王朝知道·作者佚名  2009-05-04  
宽屏版  字体: |||超大  
 
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
 
问题描述:

我有一张照片 现在我吧它用PS弄成卡通效果 保存现在有手里就有了两张拉,一张卡通个 一张现实的在ASP.NET 或PHP里面有没有办法判断出这两张图片近视相同 颜色近视相同和轮廓近视相同?请高手指教QQ:***********E-mail:luyinhunba@163.com谢谢观看!

参考答案:

1、首先不知道你所谓的卡通是什么样子的?

2、经过PS后(你提到了卡通效果)应该在饱和度、某点的颜色值都发生了变化,当然色深度也有可能变了。

提供一个思路:将两张图片在内存中都转化为,相同色深的位图,然后灰度处理,再然后利用边缘检测法判断边缘(这里是有局限性的,需要背景比较明显,如果背景也是图像效果不好,此法的代码在网上应该可以找到)。然后记录边缘的矩阵值,把两个做比较,设置允许差错范围(比如100边缘数据里有90个以上的值一致就认为是同一张图)

当然,在处理速度上你自己再看看二次样条、傅利叶、插值等算法吧…

哥们,你这个项目不是个小项目呀!如果真是个本科生的毕设,那个学校的老师也太牛了!如果有这个学校,我希望到那里上研!强……

补充:轮廓提取算法

/*************************************************************************

*

* 函数名称:

* ContourDIB()

*

* 参数:

* LPSTR lpDIBBits - 指向源DIB图像指针

* LONG lWidth - 源图像宽度(象素数,必须是4的倍数)

* LONG lHeight - 源图像高度(象素数)

* 返回值:

* BOOL - 运算成功返回TRUE,否则返回FALSE。

*

* 说明:

* 该函数用于对图像进行轮廓提取运算。

*

* 要求目标图像为只有0和255两个灰度值的灰度图像。

************************************************************************/

BOOL WINAPI ContourDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)

{

// 指向源图像的指针

LPSTR lpSrc;

// 指向缓存图像的指针

LPSTR lpDst;

// 指向缓存DIB图像的指针

LPSTR lpNewDIBBits;

HLOCAL hNewDIBBits;

//循环变量

long i;

long j;

unsigned char n,e,s,w,ne,se,nw,sw;

//像素值

unsigned char pixel;

// 暂时分配内存,以保存新图像

hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);

if (hNewDIBBits == NULL)

{

// 分配内存失败

return FALSE;

}

// 锁定内存

lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存,设定初始值为255

lpDst = (char *)lpNewDIBBits;

memset(lpDst, (BYTE)255, lWidth * lHeight);

for(j = 1; j <lHeight-1; j++)

{

for(i = 1;i <lWidth-1; i++)

{

// 指向源图像倒数第j行,第i个象素的指针

lpSrc = (char *)lpDIBBits + lWidth * j + i;

// 指向目标图像倒数第j行,第i个象素的指针

lpDst = (char *)lpNewDIBBits + lWidth * j + i;

注意要转换为unsigned char型

pixel = (unsigned char)*lpS

//取得当前指针处的像素值,rc;

//目标图像中含有0和255外的其它灰度值

// if(pixel != 255 && pixel != 0)

// return FALSE;

if(pixel == 0)

{

*lpDst = (unsigned char)0;

nw = (unsigned char)*(lpSrc + lWidth -1);

n = (unsigned char)*(lpSrc + lWidth );

ne = (unsigned char)*(lpSrc + lWidth +1);

w = (unsigned char)*(lpSrc -1);

e = (unsigned char)*(lpSrc +1);

sw = (unsigned char)*(lpSrc - lWidth -1);

s = (unsigned char)*(lpSrc - lWidth );

se = (unsigned char)*(lpSrc - lWidth +1);

//如果相邻的八个点都是黑点

if(nw+n+ne+w+e+sw+s+se==0)

{

*lpDst = (unsigned char)255;

}

}

}

}

// 复制腐蚀后的图像

memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

// 释放内存

LocalUnlock(hNewDIBBits);

LocalFree(hNewDIBBits);

// 返回

return TRUE;

}

/*************************************************************************

*

* 函数名称:

* TraceDIB()

*

* 参数:

* LPSTR lpDIBBits - 指向源DIB图像指针

* LONG lWidth - 源图像宽度(象素数,必须是4的倍数)

* LONG lHeight - 源图像高度(象素数)

* 返回值:

* BOOL - 运算成功返回TRUE,否则返回FALSE。

*

* 说明:

* 该函数用于对图像进行轮廓跟踪运算。

*

* 要求目标图像为只有0和255两个灰度值的灰度图像。

************************************************************************/

BOOL WINAPI TraceDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)

{

// 指向源图像的指针

LPSTR lpSrc;

// 指向缓存图像的指针

LPSTR lpDst;

// 指向缓存DIB图像的指针

LPSTR lpNewDIBBits;

HLOCAL hNewDIBBits;

// 图像每行的字节数

LONG lLineBytes;

//循环变量

long i;

long j;

//像素值

unsigned char pixel;

//是否找到起始点及回到起始点

bool bFindStartPoint;

//是否扫描到一个边界点

bool bFindPoint;

//起始边界点与当前边界点

Point StartPoint,CurrentPoint;

//八个方向和起始扫描方向

int Direction[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}};

int BeginDirect;

// 计算图像每行的字节数

lLineBytes = WIDTHBYTES(lWidth * 8);

// 暂时分配内存,以保存新图像

hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);

if (hNewDIBBits == NULL)

{

// 分配内存失败

return FALSE;

}

// 锁定内存

lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存,设定初始值为255

lpDst = (char *)lpNewDIBBits;

memset(lpDst, (BYTE)255, lLineBytes * lHeight);

//先找到最左上方的边界点

bFindStartPoint = false;

for (j = 0;j < lHeight && !bFindStartPoint;j++)

{

for(i = 0;i < lWidth && !bFindStartPoint;i++)

{

// 指向源图像倒数第j行,第i个象素的指针

lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

//取得当前指针处的像素值,注意要转换为unsigned char型

pixel = (unsigned char)*lpSrc;

if(pixel == 0)

{

bFindStartPoint = true;

StartPoint.Height = j;

StartPoint.Width = i;

// 指向目标图像倒数第j行,第i个象素的指针

lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;

*lpDst = (unsigned char)0;

}

}

}

//由于起始点是在左下方,故起始扫描沿左上方向

BeginDirect = 0;

//跟踪边界

bFindStartPoint = false;

//从初始点开始扫描

CurrentPoint.Height = StartPoint.Height;

CurrentPoint.Width = StartPoint.Width;

while(!bFindStartPoint)

{

bFindPoint = false;

while(!bFindPoint)

{

//沿扫描方向查看一个像素

lpSrc = (char *)lpDIBBits + lLineBytes * ( CurrentPoint.Height + Direction[BeginDirect][1])

+ (CurrentPoint.Width + Direction[BeginDirect][0]);

pixel = (unsigned char)*lpSrc;

if(pixel == 0)

{

bFindPoint = true;

CurrentPoint.Height = CurrentPoint.Height + Direction[BeginDirect][1];

CurrentPoint.Width = CurrentPoint.Width + Direction[BeginDirect][0];

if(CurrentPoint.Height == StartPoint.Height && CurrentPoint.Width == StartPoint.Width)

{

bFindStartPoint = true;

}

lpDst = (char *)lpNewDIBBits + lLineBytes * CurrentPoint.Height + CurrentPoint.Width;

*lpDst = (unsigned char)0;

//扫描的方向逆时针旋转两格

BeginDirect--;

if(BeginDirect == -1)

BeginDirect = 7;

BeginDirect--;

if(BeginDirect == -1)

BeginDirect = 7;

}

else

{

//扫描方向顺时针旋转一格

BeginDirect++;

if(BeginDirect == 8)

BeginDirect = 0;

}

}

}

// 复制腐蚀后的图像

memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

// 释放内存

LocalUnlock(hNewDIBBits);

LocalFree(hNewDIBBits);

// 返回

return TRUE;

}

小贴士:① 若网友所发内容与教科书相悖,请以教科书为准;② 若网友所发内容与科学常识、官方权威机构相悖,请以后者为准;③ 若网友所发内容不正确或者违背公序良俗,右下举报/纠错。
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有