VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: lemondian

[求助] 有关图片的旋转与放缩问题

[复制链接]
发表于 2014-3-14 23:41:48 | 显示全部楼层
lemondian 发表于 2014-3-14 22:41
先行谢谢了!
同时还有几个问题:
1。有些图片旋转,有些不要!能不能判断图像是否需要旋转 (最好系能判 ...

修改了下,可以自动判断旋转,但不能判断往哪个方向转,只顺时针转


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1威望 +5 收起 理由
lemondian + 5 赞一个

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-15 09:32:01 | 显示全部楼层
再次谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-3-15 10:21:58 | 显示全部楼层
找个人脸识别的算法
回复 支持 反对

使用道具 举报

发表于 2014-3-15 13:39:55 | 显示全部楼层
写了个简单的算法,可以输出旋转的角度,我看楼上的不是用GDI做旋转,旋转的就不改了。
简单做了下优化,时间在1.5秒左右;不算太好。:

得分情况:scoreX:308,scoreY:1115,scoreU:400,scoreD:1023
旋转角度:-90
计算用时:1.34375
-------------
得分情况:scoreX:33964,scoreY:36196,scoreU:1084,scoreD:69076
旋转角度:-180
计算用时:1.59375
-------------

回头再发整个项目程序;
  1. Option Explicit
  2. 'Add by xmxoxo 用于分析图像
  3. Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long

  4. '2014-3-15 add by xmxoxo
  5. '判断图像需要旋转的方向;思路:二值化后保留头发,判断头发所在的方位
  6. Public Function GetDirection(objPic As PictureBox, sngBright As Single) As Integer
  7.     Dim x As Long, y As Long
  8.     Dim scoreX As Long, scoreY As Long
  9.     Dim scoreU As Long, scoreD As Long
  10.     Dim lngColor As Long
  11.     Dim intBright As Integer
  12.    
  13.     '寻找黑色的头发所在的地方
  14.     For x = 1 To objPic.width
  15.         For y = 1 To objPic.Height
  16.             lngColor = GetPixel(objPic.hDC, x, y)
  17.             If lngColor < 8323072 Then
  18.                 intBright = Bright(lngColor)
  19.                
  20.                 If intBright < sngBright Then
  21.                     If x <= objPic.width / 2 Then
  22.                         scoreX = scoreX + 1
  23.                     Else
  24.                         scoreY = scoreY + 1
  25.                     End If
  26.                     If y <= objPic.Height / 2 Then
  27.                         scoreU = scoreU + 1
  28.                     Else
  29.                         scoreD = scoreD + 1
  30.                     End If
  31.                
  32.                 End If
  33.             End If
  34.         Next
  35.     Next
  36.    
  37.     Debug.Print "得分情况:scoreX:" & scoreX & ",scoreY:" & scoreY & ",scoreU:" & scoreU & ",scoreD:" & scoreD
  38.     If Abs(scoreX - scoreY) / (scoreX + scoreY) < 0.5 Then
  39.         '左右基本对称,判断上下
  40.         If Abs(scoreU - scoreD) / (scoreU + scoreD) < 0.5 Then
  41.             GetDirection = 0    '上下基本对称,图像可能不是一个头像
  42.         Else
  43.             If scoreU > scoreD Then
  44.                 GetDirection = 0    '头在上,正确
  45.             Else
  46.                 GetDirection = -180     '头在下,翻转180
  47.             End If
  48.         End If
  49.         
  50.     Else
  51.         If scoreX > scoreY Then
  52.             GetDirection = 90
  53.         Else
  54.             GetDirection = -90
  55.         End If
  56.     End If
  57. End Function

  58. '计算像素点的亮度
  59. Private Function Bright(value As Long) As Integer
  60.     On Error Resume Next
  61.     Dim sHex As String
  62.     Dim lngT As Long
  63.     Dim r As Byte, g As Byte, b As Byte
  64.    
  65.    
  66.     If Color < 0 Then
  67.         Bright = 0
  68.         Exit Function
  69.     End If
  70.      
  71.     r = value Mod 256
  72.     lngT = value / 256
  73.    
  74.     g = lngT Mod 256
  75.     lngT = lngT / 256
  76.    
  77.     b = lngT Mod 256
  78.    
  79.     If r > g Then
  80.         If r > b Then
  81.             Bright = r * 100 / 255
  82.         Else
  83.             Bright = b * 100 / 255
  84.         End If
  85.     Else
  86.         If g > b Then
  87.             Bright = g * 100 / 255
  88.         Else
  89.             Bright = b * 100 / 255
  90.         End If
  91.     End If
  92.    

  93.     If Err Then
  94.         Err.Clear
  95.     End If
  96. End Function
复制代码

点评

NB呀,虽然看得不太懂,期盼完整程序  发表于 2014-3-15 21:13
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-15 22:29:30 | 显示全部楼层
用了lowxiong 的方法,整合到自已的学生图片导入中了!
比较了一下:缩小同一比例生成的图片:bmp的比jpg的大三倍左右!
不知是否有解决的方法?
回复 支持 反对

使用道具 举报

发表于 2014-3-15 23:14:58 | 显示全部楼层
图片缩放处理还是要用GDI+,保存成JPG的格式;
晚上在搞另一个算法,一会回来整合下这个算法;

点评

期待中...  发表于 2014-3-16 12:16
回复 支持 反对

使用道具 举报

发表于 2014-3-17 01:48:39 | 显示全部楼层


完成了程序整合,顺便加上了保存成JPG格式,不过生成缩略图的算法还是用楼上的;
楼主可以用程序里带的方法来自己处理下,优化后处理时间只要0.X秒。
附程序运行截图:几种处理的情况,由于样本不够,准确性测不出来。
楼主用的时候可以调整一下程序里的亮度参数:45






最后附上源码包:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

补充说明下:算法是用头发来判断的,要是光头或者衣服是黑色一大块可能就判断不准确了, 可以多找些图像来试试,我估计用于档案管理的照片基本上是标准的,不至于光头或者是黑衣服吧,哈。  发表于 2014-3-17 01:59
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-17 11:01:14 | 显示全部楼层
本帖最后由 lemondian 于 2014-3-17 11:09 编辑

xmxoxo :
今天我用一张2448*3264的图片(jpg格式,约1.67MB,图片大放不上来就不放了)进行测试(缩小为0.04倍),转换用时0.97秒。缩小后为98*131,3.5KB。
但后来又做了一个批量转换:51张(格式如上所说),速度极差(用时已超20分钟,程式进入假死,最后还是可以转换)。
不知是什么原因?
================================
同时说明:
用了lowxiong 的方法,转一张2448*3264的图片也成功(只是缩小后约为38KB),但进行批量转换时,速度会快很多,居然出现所有图片只是空白!
为什么呢?
回复 支持 反对

使用道具 举报

发表于 2014-3-17 14:00:43 | 显示全部楼层
请问你是怎么进行批量转换的?

还有一个过程我没有处理,就是缩略部份的算法,直接用GDI+读取文件生成缩略会比较快。
而且缩略的方式应该是:指定要生成的缩略图的大小,比如所有的图都转换成100*130
而不是根据缩小倍数来,这样应该会比较方便直接。

如果你的项目没有保密性问题的话,可以把51张图片样本发到我的邮箱 (xmxoxo at QQ.com)。
稍后我抽时间把缩略功能也改成GDI+,这样整个转换,识别过程都在内存中执行,就很快了。


另外,你没有提到51张照片转换完成后,对方向 的识别是否都正确,正确率有多少?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-17 14:24:29 | 显示全部楼层
本帖最后由 lemondian 于 2014-3-17 14:36 编辑

'就是重复调用函数TurnPic呀   
    For i = 1 To 51
            If i < 10 Then
                file = app.path  & "aa\12150" & i & ".jpg"
            Else
                file = app.path  & "aa\1215" & i & ".jpg"
            End If
            If Dir(file) <> "" Then
                If Not TurnPic(file, file & "-tmp.jpg", 0.04) Then MsgBox "图片转换失败,可能不是图像或没找到图像"
            Else
                file = ""
            End If
        Next i
==================
1.方向的识别好象也有问题!
2."指定要生成的缩略图的大小,比如所有的图都转换成100*130"---->这样的设定最好了!当然缩小倍数的也有就更好!
3.51张象片已发送到你邮箱!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 10:53

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表