几何尺寸与公差论坛

 找回密码
 注册
查看: 199|回复: 5

图像进行坐标变换时发现某些像素丢失

  [复制链接]
发表于 2024-10-31 08:56:16 | 显示全部楼层 |阅读模式
图像我旋转30度,然后在新的图像上用仿射变换将坐标变换回原来的图像坐标生成cad,老是有一条线

本帖子中包含更多资源

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

x
 楼主| 发表于 2024-10-31 08:59:01 | 显示全部楼层
在3X3的矩阵用对角4个点做插值

本帖子中包含更多资源

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

x
 楼主| 发表于 2024-10-31 09:15:07 | 显示全部楼层
双线性插值的解释

白板上的3x3矩阵表示插值操作,中心绿色点是目标位置,通过4个相邻像素点(左上、左下、右上、右下)进行插值计算。这种方法通常用于平滑缩放或变换图像,避免像素丢失和锯齿效应。
建议

    边界处理:当目标像素靠近图像边缘时,需要判断 nx 和 ny 是否超出图像范围,否则可能导致越界错误。

    效率优化:若图像较大且插值计算频繁,可以考虑使用并行处理优化性能,比如利用多线程或者GPU加速。

此代码结构简单但有效,适用于大多数图像缩放或平移操作。
 楼主| 发表于 2024-10-31 09:16:14 | 显示全部楼层
#include <cmath>
#include <omp.h>

bool CLayerLocatePro_Updata::ProcessInterpolate(const BYTE *pImage, int nWidth, int nHeight,
                                                const RLE_DATA *pRLE, int nCount,
                                                double fShiftX, double fShiftY, BYTE *pDestImg) {
    #pragma omp parallel for // OpenMP并行化
    for (int j = 0; j < nHeight; ++j) {
        for (int i = 0; i < nWidth; ++i) {
            int nx = (int)floor(fShiftX);
            int ny = (int)floor(fShiftY);
            double dx = fShiftX - (double)nx;
            double dy = fShiftY - (double)ny;

            double coef11 = (1 - dx) * (1 - dy);
            double coef12 = (1 - dx) * dy;
            double coef21 = dx * (1 - dy);
            double coef22 = dx * dy;

            // 确保像素索引不越界
            if (j + ny + 1 < nHeight && i + nx + 1 < nWidth) {
                pDestImg[j * nWidth + i] = (BYTE)(
                    pImage[(j + ny) * nWidth + i + nx] * coef11 +
                    pImage[(j + ny + 1) * nWidth + i + nx] * coef12 +
                    pImage[(j + ny) * nWidth + i + nx + 1] * coef21 +
                    pImage[(j + ny + 1) * nWidth + i + nx + 1] * coef22
                );
            }
        }
    }
    return true;
}
 楼主| 发表于 2024-10-31 09:17:02 | 显示全部楼层
解释

    使用#pragma omp parallel for并行化外层循环。OpenMP会将每一行的处理分配给多个线程。
    在循环内部进行双线性插值的计算。
    边界检查确保索引不越界。
 楼主| 发表于 2024-11-8 11:51:09 | 显示全部楼层
bug原因找到:边界数据有误
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-31 01:07 , Processed in 0.044651 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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