找回密码
 加入
搜索
查看: 180|回复: 7

有谁懂得畸形图片校正的算法吗?

[复制链接]
发表于 2024-12-6 08:06:02 | 显示全部楼层 |阅读模式
如图:把任意四边形校正成一个矩形,有没有透视变换公式?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2024-12-6 14:55:44 | 显示全部楼层
本帖最后由 vigiles 于 2024-12-6 14:58 编辑


https://pic1.58cdn.com.cn/nowater/webim/big/n_v2e733f98e6b90419497938b74b4b2a7e0.jpg

====

请原谅,理解错了


 楼主| 发表于 2024-12-7 19:55:16 | 显示全部楼层
原理在这里:
https://blog.csdn.net/weixin_44322778/article/details/129996366
https://zhuanlan.zhihu.com/p/445907317
要求出转换矩阵,要求8阶逆阵、8阶行列式、伴随矩阵,太复杂了!
发表于 2024-12-11 18:14:47 | 显示全部楼层
ai实现
#include <GDIPlus.au3>
#include <Array.au3>
#include <Math.au3>

; 初始化 GDI+
_GDIPlus_Startup()

Func PerspectiveTransform($srcImage, $srcPoints, $dstPoints)
    ; 计算透视变换矩阵
    Local $matrix = _GetPerspectiveMatrix($srcPoints, $dstPoints)
    If Not IsArray($matrix) Then Return False
    
    ; 获取原图尺寸
    Local $width = _GDIPlus_ImageGetWidth($srcImage)
    Local $height = _GDIPlus_ImageGetHeight($srcImage)
    
    ; 创建目标图像
    Local $dstImage = _GDIPlus_BitmapCreateFromScan0($width, $height)
    Local $graphics = _GDIPlus_ImageGetGraphicsContext($dstImage)
    
    ; 应用变换
    Local $points[3][2]
    For $y = 0 To $height - 1
        For $x = 0 To $width - 1
            ; 计算源坐标
            Local $srcX = ($matrix[0][0] * $x + $matrix[0][1] * $y + $matrix[0][2]) / _
                         ($matrix[2][0] * $x + $matrix[2][1] * $y + $matrix[2][2])
            Local $srcY = ($matrix[1][0] * $x + $matrix[1][1] * $y + $matrix[1][2]) / _
                         ($matrix[2][0] * $x + $matrix[2][1] * $y + $matrix[2][2])
            
            ; 检查坐标是否在范围内
            If $srcX >= 0 And $srcX < $width And $srcY >= 0 And $srcY < $height Then
                ; 获取源像素颜色并设置目标像素
                Local $color = _GDIPlus_BitmapGetPixel($srcImage, $srcX, $srcY)
                _GDIPlus_BitmapSetPixel($dstImage, $x, $y, $color)
            EndIf
        Next
    Next
    
    Return $dstImage
EndFunc

Func _GetPerspectiveMatrix($src, $dst)
    ; 构建方程组系数矩阵
    Local $A[8][8], $B[8]
    For $i = 0 To 3
        $A[$i * 2][0] = $src[$i][0]
        $A[$i * 2][1] = $src[$i][1]
        $A[$i * 2][2] = 1
        $A[$i * 2][3] = 0
        $A[$i * 2][4] = 0
        $A[$i * 2][5] = 0
        $A[$i * 2][6] = -$src[$i][0] * $dst[$i][0]
        $A[$i * 2][7] = -$src[$i][1] * $dst[$i][0]
        $B[$i * 2] = $dst[$i][0]
        
        $A[$i * 2 + 1][0] = 0
        $A[$i * 2 + 1][1] = 0
        $A[$i * 2 + 1][2] = 0
        $A[$i * 2 + 1][3] = $src[$i][0]
        $A[$i * 2 + 1][4] = $src[$i][1]
        $A[$i * 2 + 1][5] = 1
        $A[$i * 2 + 1][6] = -$src[$i][0] * $dst[$i][1]
        $A[$i * 2 + 1][7] = -$src[$i][1] * $dst[$i][1]
        $B[$i * 2 + 1] = $dst[$i][1]
    Next
    
    ; 解线性方程组
    Local $h = _SolveLinearSystem($A, $B)
    If Not IsArray($h) Then Return False
    
    ; 构建透视变换矩阵
    Local $matrix[3][3]
    $matrix[0][0] = $h[0]
    $matrix[0][1] = $h[1]
    $matrix[0][2] = $h[2]
    $matrix[1][0] = $h[3]
    $matrix[1][1] = $h[4]
    $matrix[1][2] = $h[5]
    $matrix[2][0] = $h[6]
    $matrix[2][1] = $h[7]
    $matrix[2][2] = 1
    
    Return $matrix
EndFunc

; 使用示例
Func Main()
    ; 加载源图像
    Local $srcImage = _GDIPlus_ImageLoadFromFile("source.jpg")
    
    ; 定义源图像中的四个点(畸变图像的四个角点)
    Local $srcPoints[4][2] = [[100, 100], [500, 50], [50, 400], [450, 350]]
    
    ; 定义目标图像中的四个点(矩形的四个角点)
    Local $width = 400
    Local $height = 300
    Local $dstPoints[4][2] = [[0, 0], [$width, 0], [0, $height], [$width, $height]]
    
    ; 执行透视变换
    Local $dstImage = PerspectiveTransform($srcImage, $srcPoints, $dstPoints)
    
    ; 保存结果
    _GDIPlus_ImageSaveToFile($dstImage, "result.jpg")
    
    ; 清理资源
    _GDIPlus_ImageDispose($srcImage)
    _GDIPlus_ImageDispose($dstImage)
    _GDIPlus_Shutdown()
EndFunc

Main()
 楼主| 发表于 2024-12-12 21:52:06 | 显示全部楼层

有些函数好像没有的:

ERROR: _GDIPlus_BitmapCreateFromScan0(): undefined function.
    Local $dstImage = _GDIPlus_BitmapCreateFromScan0($width, $height)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
ERROR: _GDIPlus_BitmapGetPixel(): undefined function.
                Local $color = _GDIPlus_BitmapGetPixel($srcImage, $srcX, $srcY)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
ERROR: _GDIPlus_BitmapSetPixel(): undefined function.
                _GDIPlus_BitmapSetPixel($dstImage, $x, $y, $color)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
ERROR: _SolveLinearSystem(): undefined function.
    Local $h = _SolveLinearSystem($A, $B)
发表于 2024-12-13 11:12:18 | 显示全部楼层
转身离开 分手说不出来 海鸟跟鱼相爱 只是一场意外 我们的爱差异一直存在 风中尘埃竟累积成伤
发表于 2024-12-14 09:29:50 | 显示全部楼层
auto896006008 发表于 2024-12-13 11:12
转身离开 分手说不出来 海鸟跟鱼相爱 只是一场意外 我们的爱差异一直存在 风中尘埃竟累积成伤 ...

别灌水。。。还拿着我的个性签名灌水。。。
发表于 4 天前 | 显示全部楼层

太好了,感谢大神,学习一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 00:02 , Processed in 0.087100 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表