kdv巧克力糖:ASP.NET 或 PHP 图象高手来

来源:百度文库 编辑:高校问答 时间:2024/04/30 15:30:19
我有一张照片 现在我吧它用PS弄成卡通效果 保存
现在有手里就有了两张拉,一张卡通个 一张现实的
在ASP.NET 或PHP里面有没有办法判断出这两张图片近视相同 颜色近视相同和轮廓近视相同?

请高手指教
QQ:77179680
E-mail:luyinhunba@163.com

谢谢观看!
谢谢各位的答案!
我很欣赏 wrestsoft 和 wolfccb 特别谢谢你们!

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;
}

这是一个图像处理问题,应该说涉及比较复杂的算法。如果用matlab,c/c++,vb解决,也可以做为本科生的毕业设计题目了……好像没有现成的函数。

思路:如果彩色没有意义,先把它转成黑白的,容易许多。对原图和待测黑白图像做边缘检测,得到两个边缘图像。对这两个边缘图像做模式匹配,如果对精确度要求不高,求取归一化相关系数也可以,通过这个来判断二者是否一致。

这是简单的情况,如果图像被裁剪或者缩放、旋转,就可以做硕士论文了……不知道你为什么要做这个

以上。
寒的老狼

晕了,真是不知道啊,关注一下
下面是PHP 的图象处理函数表,希望有帮助:
GetImageSize: 取得图片的长宽。
ImageArc: 画弧线。
ImageChar: 写出横向字符。
ImageCharUp: 写出直式字符。
ImageColorAllocate: 匹配颜色。
ImageColorTransparent: 指定透明背景色。
ImageCopyResized: 复制新图并调整大小。
ImageCreate: 建立新图。
ImageDashedLine: 绘虚线。
ImageDestroy: 结束图形。
ImageFill: 图形着色。
ImageFilledPolygon: 多边形区域着色。
ImageFilledRectangle: 矩形区域着色。
ImageFillToBorder: 指定颜色区域内着色。
ImageFontHeight: 取得字型的高度。
ImageFontWidth: 取得字型的宽度。
ImageInterlace: 使用交错式显示与否。
ImageLine: 绘实线。
ImageLoadFont: 载入点阵字型。
ImagePolygon: 绘多边形。
ImageRectangle: 绘矩形。
ImageSetPixel: 绘点。
ImageString: 绘横式字符串。
ImageStringUp: 绘直式字符串。
ImageSX: 取得图片的宽度。
ImageSY: 取得图片的高度。
ImageTTFBBox: 计算 TTF 文字所占区域。
ImageTTFText: 写 TTF 文字到图中。
ImageColorAt: 取得图中指定点颜色的索引值。
ImageColorClosest: 计算色表中与指定颜色最接近者。
ImageColorExact: 计算色表上指定颜色索引值。
ImageColorResolve: 计算色表上指定或最接近颜色的索引值。
ImageColorSet: 配置色表上指定索引的颜色。
ImageColorsForIndex: 取得色表上指定索引的颜色。
ImageColorsTotal: 计算图的颜色数。
ImagePSLoadFont: 载入 PostScript 字型。
ImagePSFreeFont: 卸下 PostScript 字型。
ImagePSEncodeFont: PostScript 字型转成向量字。
ImagePSText: 写 PostScript 文字到图中。
ImagePSBBox: 计算 PostScript 文字所占区域。
ImageCreateFromPNG: 取出 PNG 图型。
ImagePNG: 建立 PNG 图型。
ImageCreateFromGIF: 取出 GIF 图型。
ImageGIF: 建立 GIF 图型。

代码太长了
我实在是不想去研究
给你看看我做的一个php图象输出
http://ceshi.hzoko.com/php/pic/pic5.php
我觉得要判断是否近视
要对点进行扫描
进行加权处理
最好是应用到平方差来分析

图形图象 操作系统 软件应用 服务器 Visual C++ Visual ...PHP JSP...剖析ASP.NET2.0站点导航功能之建立

1.下面是PHP 的图象处理函数表,希望有帮助:
GetImageSize: 取得图片的长宽。
ImageArc: 画弧线。
ImageChar: 写出横向字符。
ImageCharUp: 写出直式字符。
ImageColorAllocate: 匹配颜色。
ImageColorTransparent: 指定透明背景色。
ImageCopyResized: 复制新图并调整大小。
ImageCreate: 建立新图。
ImageDashedLine: 绘虚线。
ImageDestroy: 结束图形。
ImageFill: 图形着色。
ImageFilledPolygon: 多边形区域着色。
ImageFilledRectangle: 矩形区域着色。
ImageFillToBorder: 指定颜色区域内着色。
ImageFontHeight: 取得字型的高度。
ImageFontWidth: 取得字型的宽度。
ImageInterlace: 使用交错式显示与否。
ImageLine: 绘实线。
ImageLoadFont: 载入点阵字型。
ImagePolygon: 绘多边形。
ImageRectangle: 绘矩形。
ImageSetPixel: 绘点。
ImageString: 绘横式字符串。
ImageStringUp: 绘直式字符串。
ImageSX: 取得图片的宽度。
ImageSY: 取得图片的高度。
ImageTTFBBox: 计算 TTF 文字所占区域。
ImageTTFText: 写 TTF 文字到图中。
ImageColorAt: 取得图中指定点颜色的索引值。
ImageColorClosest: 计算色表中与指定颜色最接近者。
ImageColorExact: 计算色表上指定颜色索引值。
ImageColorResolve: 计算色表上指定或最接近颜色的索引值。
ImageColorSet: 配置色表上指定索引的颜色。
ImageColorsForIndex: 取得色表上指定索引的颜色。
ImageColorsTotal: 计算图的颜色数。
ImagePSLoadFont: 载入 PostScript 字型。
ImagePSFreeFont: 卸下 PostScript 字型。
ImagePSEncodeFont: PostScript 字型转成向量字。
ImagePSText: 写 PostScript 文字到图中。
ImagePSBBox: 计算 PostScript 文字所占区域。
ImageCreateFromPNG: 取出 PNG 图型。
ImagePNG: 建立 PNG 图型。
ImageCreateFromGIF: 取出 GIF 图型。
ImageGIF: 建立 GIF 图型。
2.这是一个图像处理问题,应该说涉及比较复杂的算法。如果用matlab,c/c++,vb解决,也可以做为本科生的毕业设计题目了……好像没有现成的函数。

思路:如果彩色没有意义,先把它转成黑白的,容易许多。对原图和待测黑白图像做边缘检测,得到两个边缘图像。对这两个边缘图像做模式匹配,如果对精确度要求不高,求取归一化相关系数也可以,通过这个来判断二者是否一致。

这是简单的情况,如果图像被裁剪或者缩放、旋转,就可以做硕士论文了……不知道你为什么要做这个
3.图形图象 操作系统 软件应用 服务器 Visual C++ Visual ...PHP JSP...剖析ASP.NET2.0站点导航功能之建立

参考资料:http://www.tongyi.net/