首页 > 其他分享 >图像配准

图像配准

时间:2023-12-06 22:00:48浏览次数:20  
标签:配准 img moving 图像 np fixed

目录

一 基于互信息与相关性的图像配准

1 互信息定义及图像配准

互信息定义如下:

\[MI(X;Y) = \sum\limits_{x}\sum\limits_{y}p_{(X,Y)}(x,y)\log\cfrac{p_{(X,Y)}(x,y)}{{p_X(x)}\cdot{p_Y(y)}} \]

从定义中可以看出,当X和Y两个变量趋近于独立时,

\[p_{(X,Y)}(x,y)={p_X(x)}\cdot{p_Y(y)} \]

此时,

\[\log\cfrac{p_{(X,Y)}(x,y)}{{p_X(x)}\cdot{p_Y(y)}}\approx 0,MI(X;Y)有最小值。 \]

反之,若X和Y两个变量越相关,

\[MI(X;Y)则越大。 \]

基于以上理论,设有模板图片fixed、待配准图片moving,若

\[fixed ( x , y ) = moving( x − △ x , y − △ y ) \]

则当moving平移 △x、 △y 时,以fixed、moving图像二维亮度直方图(表示联合分布)作为输入,求得的互信息MI有最大值。

2 相关性的定义及图像配准

皮尔逊相关系数:

\[ ρX,Y=\cfrac{cov(X,Y)}{σXσY}=\cfrac{[(X−μX)(Y−μY)]}{σXσYE} \]

\[ρX,Y =\cfrac{\sum\limits_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{{\sum\limits_{i=1}^n(x_i-\bar{x}} )^2}\sqrt{{\sum\limits_{i=1}^n(y_i-\bar{y}} )^2}}\\ \\ \quad\quad\ = \cfrac{n\sum x_iy_i-\sum x_i \sum y_i}{\sqrt{n \sum x_i^2-(\sum x_i)^2}\sqrt{n \sum y_i^2-(\sum y_i)^2}} \]

基于以上理论,设有模板图片fixed、待配准图片moving,若

\[fixed ( x , y ) = moving( x − △ x , y − △ y ) \]

则当moving平移 △x、 △y 时,将fixed、moving图像按照一维数据排列,进行相关性计算,求得的相关性有最大值;相关性越接近1,配准效果越好,反之,相关性越接近0,配准效果越差。

二 模板图像fixed、(待)配准图像moving的可视化

1 fixed 和 moving 图像的直方图

image

注:配准后图像的缺失边界可以用fixed图像对应的像素来填充,这样差分图对应的像素值就为0。

2 fixed 和 moving 图像的散点图

image

image

从散点图上可以看出,fixed 和 待配准的 moving 图像的像素分布是相互独立的,而fixed 和 配准的 moving 图像的像素分布表现出一定的线性关系。

3 fixed 和 moving 图像的2D直方图

image

image

同样,从2D直方图上可以看出,fixed 和 待配准的 moving 图像的像素分布线性度不好,而fixed 和 配准的 moving 图像的像素分布表现出一定的线性关系。。

4 fixed 和 moving 图像的差分图

image

image

三 图像配准的代码

def mutual_information(hgram):
    """ Mutual information for joint histogram
    """
    # Convert bins counts to probability values
    pxy = hgram / float(np.sum(hgram))
    px = np.sum(pxy, axis=1)  # marginal for x over y
    py = np.sum(pxy, axis=0)  # marginal for y over x

    px_py = px[:, None] * py[None, :]  # Broadcast to multiply marginals
    nzs = pxy > 0  # Only non-zero pxy values contribute to the sum

    return np.sum(pxy[nzs] * np.log2(pxy[nzs] / px_py[nzs]))


def correlation_information(img_fixed, img_moved):
    def NCC(img1, img2):
        # # 图片2的标准差
        # print(np.std(img2))
        # 相关系数,这里使用的是有偏估计
        # 协方差 Cov(X, Y) = Σ((Xᵢ - μₓ)(Yᵢ - μᵧ)) / n
        # 方差 D(X) = (∑(x - μ)²) / n
        # R = Con(X, Y) / (sqrt(D(X)) * sqrt(D(Y)))
        con = np.mean(np.multiply((img1 - np.mean(img1)), (img2 - np.mean(img2))))  # 协方差
        img1Std = np.std(img1)
        img2Std = np.std(img2)
        NCCValue = con / (img1Std * img2Std)

        return NCCValue
    r, _ = stats.pearsonr(img_fixed.ravel(), img_moved.ravel())
    # ncc_cal_in = np.corrcoef(img_fixed.astype(np.float32).flatten(), img_moved.astype(np.float32).flatten())[0][1]
    # ncc_cal = NCC(img_fixed, img_moved)
    # print(r, ncc_cal_in, ncc_cal)
    return r


METHOD_REGISTRATION_MI = 0
METHOD_REGISTRATION_CI = 1


def ImageRegistration(img_fixed, img_moved, max_offset_XY=(5, 5), method=METHOD_REGISTRATION_MI):
    large = -np.inf
    large_ij = []
    h, w = img_moved.shape[:2]
    ox, oy = max_offset_XY
    dirs = [(-1, -1), (-1, 1), (1, 1), (1, -1)]
    for i in range(oy):
        for j in range(ox):
            if i == 0 and j == 0:
                ret = 0
                if method == METHOD_REGISTRATION_MI:
                    hist_2d_moved, x_edges, y_edges = np.histogram2d(
                        img_fixed.ravel(),
                        img_moved.ravel(),
                        bins=255, range=[[0, 255], [0, 255]])
                    ret = mutual_information(hist_2d_moved)

                if method == METHOD_REGISTRATION_CI:
                    ret = correlation_information(img_fixed, img_moved)
                if ret > large:
                    large = ret
                    large_ij = [i, j]
                continue
            for _dir in dirs:
                deltaY = i * _dir[1]
                deltaX = j * _dir[0]
                M = np.array([[1, 0, deltaX], [0, 1, deltaY]], dtype=np.float)
                img_moved_modify = cv2.warpAffine(img_moved, M, dsize=(w, h))

                ret = 0
                if method == METHOD_REGISTRATION_MI:
                    hist_2d_moved, x_edges, y_edges = np.histogram2d(
                        img_fixed.ravel(),
                        img_moved_modify.ravel(),
                        bins=256, range=[[0, 255], [0, 255]])
                    ret = mutual_information(hist_2d_moved)
                if method == METHOD_REGISTRATION_CI:
                    ret = correlation_information(img_fixed, img_moved_modify)
                if ret > large:
                    large = ret
                    large_ij = [deltaY, deltaX]
    offset_y, offset_x = large_ij
    print("ret = {}, offset_y = {}, offset_x = {} pixel".format(large, offset_y, offset_x))
    M = np.array([[1, 0, offset_x], [0, 1, offset_y]], dtype=np.float)
    img_moved_final = cv2.warpAffine(img_moved, M, dsize=(w, h))
    return img_moved_final, offset_x, offset_y
    
   

标签:配准,img,moving,图像,np,fixed
From: https://www.cnblogs.com/nbk-zyc/p/17880631.html

相关文章

  • 使用百度完成gui的图像处理(需要下载百度的javasdk文档,主要工具带代码在sdk之中,以下代
    packageGui;importcom.baidu.aip.imageprocess.AipImageProcess;importorg.json.JSONObject;importjavax.imageio.ImageIO;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.i......
  • 处理实时视频流:第三方美颜SDK的实时图像处理策略
    为了提高用户体验,许多应用和平台开始采用第三方美颜SDK,通过先进的图像处理技术实时改善视频中的面部外观。本文将深入探讨这些第三方美颜SDK在实时视频流处理中所采用的图像处理策略,揭示其背后的技术原理和创新。一、引言实时视频流处理涉及复杂的图像处理算法和实时性的挑战。第三......
  • RK3588 RGA 图像操作
    背景公司业务需要用到RK3588的RGA进行图像处理加速,网上搜了下,这方面的资料很少,在此记录下自己从熟悉文档到应用的整个过程,给有相关需求的小伙伴做个参考。 一、什么是RGARGA(RasterGraphicAccelerationUnit)是一个独立的2D硬件加速器,可用于加速点/线绘制,执行图像缩放、......
  • 基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览  2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述      基于FPGA的图像直方图统计实现主要是通过利用FPGA的并行处理能力,对图像中的每个像素进行统计,以计算出每个灰度级出现的次数或概率。这个过程涉及到对图像数据的快速......
  • YOLO V8 图像训练
    一、YOLO简史YOLO(YouOnlyLookOnce),由华盛顿大学的JosephRedmon和AliFarhadi开发的流行目标检测和图像分割模型,于2015年推出,由于其高速和准确性而迅速流行。从YOLOv2-YOLOv7不断优化升级,YOLOv8是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型,YOLOv8在......
  • OpenCV4.1.0与CUDAcuda_10.1.105联合进行图像特征点提取和特征匹配时,运行程序时错误提
    问题描述:OpenCV4.1.0与CUDAcuda_10.1.105联合进行图像特征点提取和特征匹配时,运行程序时错误提示:无法定位程序输入点?createBFMatchercv@DescriptorMatcher@cuda@cv......于动态链接库......,如下图所示:解决办法:如果include、lib和dll的路径都配置正确的话,可以尝试将编译好的带......
  • swing的图像更改的这个这个额叫啥来着,就是文件??差不多
    首先还是展示架构image用来存储图片,api请求token,changecode用来存放图片转base64的代码(base64->changecode),ui放界面,mian用于启动!!,其余是百度图像的专用工具,你们申请然后使用人家的接口时就能看到image文件夹存储图片,里边的不叫image的是基础图片,他们经过转换都叫image。 然后......
  • 超越极限:SDXL Turbo的实时图像生成
    引言 在人工智能的迅猛发展中,图像生成技术一直是研究的热点。最近,Stability.ai推出的SDXLTurbo模型在这一领域取得了显著的突破,尤其是在提升出图效率方面,实现了重要的进展。模型概述 SDXLTurbo是基于SDXL1.0开发而成的,采用了一种全新的对抗扩散蒸馏技术(ADD),将图像所需的生成步......
  • 如何利用图像优化提升SEO效果
    除了文字内容,图像也是网站SEO优化中的重要元素。本文将为您介绍一些有效的方法和技巧,帮助您利用图像优化来提升网站的搜索引擎排名和用户体验。1.使用高质量的图片:首先,选择高质量、高清晰度的图片可以增加用户的阅读体验和网站的专业感。同时,高质量的图片也有助于提高搜索引擎的识......
  • 基于FPGA的RGB图像转Ycbcr实现,包括tb测试文件以及MATLAB辅助验证
    1.算法运行效果图预览 将FPGA的数据导入到matlab进行显示    2.算法运行软件版本Vivado2019.2 matlab2022a 3.算法理论概述     基于FPGA的RGB图像转Ycbcr转换的实现,主要是通过数字电路的设计,利用硬件并行处理的能力,快速完成图像数据的转换。   ......