相片的图象处理问题(急)(155分)

  • 主题发起人 主题发起人 hyliuwuhee
  • 开始时间 开始时间
H

hyliuwuhee

Unregistered / Unconfirmed
GUEST, unregistred user!
相片的背景固定,如何检测出人的皮肤,并对皮肤上的斑点和皱纹进行去除,
使皮肤看起来更光滑;如何使皮肤看起来更亮而不是整个变亮,如果用颜色直方图
均衡怎么实现啊?
 
最好能给出代码,hyliu19_cn@sina.com
 
用Photoshop处理阿。
 
你说的可真轻巧啊
 
楼上的,楼主提了三个问题,就这个问题我跟了一贴,我倒是一番好意帮他提前,我没有跟的时候你怎么不跟啊?你知道告诉楼主啊!
 
相信用程序是很难实现的,关键是使用软件的人
要电脑来模拟人的识别思维,难啊!
 
这样的问题才150分,太少了吧?光靠灰度来识别是不可行的。皮肤根据颜色均衡也许相对好处理,斑点和皱纹可不好办,搞不好就是五官残缺[:)]
卷起千堆雪也许可以回答你的问题。
 
首先感谢各位的回答!
现在是自己想编个程序实现这些功能,
关键第一步是如何检测到肤色范围,
然后才能说到如何进行下面的一些处理。

分数不是问题,
请继续关注!
 
启用Form的moveMove事件,用鼠标选取皮肤上的斑点和皱纹,取得Tcolor的颜色取值范围,
而后局部选取皮肤上的斑点和皱纹,调整颜色的取值,用WINAPI函数(忘了)可以实现。--思路
 
复:qinjlin76
首先谢谢你的建议,
不过你说的是要人机交互的,
我想做的是完全自动的处理过程。
而且每个人的肤色是不一样的,
所以处理起来比较麻烦!
 
嘿嘿!把张柏之、章子怡的皮肤换上去,应该没什么问题了吧!
 
太复杂拉,建议找模式识别的书来读读
 
请大家继续关注这个问题
 
呵呵,还要考虑到人的视觉问题,也许正面看比较爽,倒过来就是一团糟
 
人的皮肤检测问题可以考虑将图象的RGB颜色控件转换为其他颜色空间进行检测,效果要好一些
 
这个估计是比较难的实现。而且即使实现,效果估计不好
 
给你个思路,估计完全自动的话,效果不会很好。
先将颜色空间转化成为HSV,根据H来区分是不是皮肤。
扩散搜索,找到边界
对边界内的象素进行亮度、饱和度(S、V)统计(最大值、最小值,平均值、加权平均值)
根据S、V的值和标准S、V的值的差值进行调整,这样皮肤的亮度、饱和度就能提高,看起来
光鲜了。
斑点和皱纹可以根据H值的跳动来检测,然后再根据左、右、上、下区间(可以进行设定,一般5*5为宜)的H来进行修正。
 
同意 zhu_jy
不过这是个难题。
简单的方法就是要使用者自己画出脸的区域
再用电脑操作。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:Integer;
Pl1,pl2,pl3,pl:PByteArray;
otbmp:TBitmap;
tbmp:TBitmap;
begin
tbmp:=TBitmap.Create;
tbmp.Assign(image1.Picture.Bitmap);
otbmp:=TBitmap.Create;
tbmp.PixelFormat:=pf24bit;
otbmp.PixelFormat:=pf24bit;
otbmp.Width:=tbmp.Width;
otbmp.Height:=tbmp.Height;
pl2:=tbmp.ScanLine[1];
pl2:=tbmp.ScanLine[2];
for i:=0 to tbmp.Height -3 do
begin
pl1:=pl2;
pl2:=pl3;
pl3:=tbmp.ScanLine;
pl:=otbmp.ScanLine;
for j:=2 to (tbmp.Width-2)*3 do
begin
pl[j]:=(pl1[j-3]+pl1[j]+pl1[j+3]+
pl2[j-3]+pl2[j]+pl2[j+3]+
pl3[j-3]+pl3[j]+pl3[j+3])div 9;
end;

end;
image1.Picture.Bitmap :=otbmp;
otbmp.Free;
tbmp.free;
end;

end.
看看行不行。
 
文理你可以使用中值滤波去除一部分,你看一看图像处理出书把
 
后退
顶部