精华内容
下载资源
问答
  • 下采样
    千次阅读
    2022-01-20 15:20:00

    1. 导包

    from sklearn.datasets import load_iris
    from sklearn.datasets import load_breast_cancer
    from collections import Counter
    
    from imblearn.over_sampling import RandomOverSampler
    from imblearn.over_sampling import SMOTE
    from imblearn.over_sampling import SMOTEN
    from imblearn.over_sampling import SMOTENC
    from imblearn.over_sampling import BorderlineSMOTE
    from imblearn.over_sampling import SVMSMOTE
    from imblearn.over_sampling import KMeansSMOTE
    from imblearn.over_sampling import ADASYN
    
    from imblearn.under_sampling import RandomUnderSampler
    from imblearn.under_sampling import ClusterCentroids
    from imblearn.under_sampling import NearMiss
    from imblearn.under_sampling import EditedNearestNeighbours
    from imblearn.under_sampling import RepeatedEditedNearestNeighbours
    from imblearn.under_sampling import AllKNN
    from imblearn.under_sampling import CondensedNearestNeighbour
    from imblearn.under_sampling import OneSidedSelection
    from imblearn.under_sampling import NeighbourhoodCleaningRule
    from imblearn.under_sampling import InstanceHardnessThreshold
    
    from imblearn.combine import SMOTEENN
    from imblearn.combine import SMOTETomek
    
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import confusion_matrix
    
    from sklearn.ensemble import BaggingClassifier
    from imblearn.ensemble import BalancedBaggingClassifier
    from imblearn.ensemble import RUSBoostClassifier
    from imblearn.ensemble import EasyEnsembleClassifier
    from imblearn.ensemble import BalancedRandomForestClassifier
    

    2. 找数据

    鸢尾花数据比较均衡,乳腺癌数据不均衡,可以用作样本数据

    X, y = load_iris(return_X_y=True)  # 鸢尾花数据集是三个类别0,1,2,而且类别均衡
    print(X, y, X.shape, y.shape, len(X), len(y), sep="\n")  # X.shape=(150, 4) y.shape=(150,) len(X)=150 len(y)=150
    print(sorted(Counter(y).items()))  # [(0, 50), (1, 50), (2, 50)]
    
    X, y = load_breast_cancer(return_X_y=True)  # 乳腺癌数据集是两个类别0,1,类别不均衡
    print(X, y)
    print(X.shape, y.shape)  # (569, 30) (569,)
    print(len(X), len(y))  # 569  569
    print(sorted(Counter(y).items()))  # [(0, 212), (1, 357)]
    count0, count1 = 0, 0
    for yy in y:
        if yy == 0:
            count0 += 1
        elif yy == 1:
            count1 += 1
    print(count0, count1)  # 212 357
    

    3. 过采样

    3.1 RandomOverSampler

    随机过采样

    ros = RandomOverSampler(random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (714, 30) (714,)
    print(len(X_resampled), len(y_resampled))  # 714 714
    print(sorted(Counter(y_resampled).items()))  # [(0, 357), (1, 357)]
    

    3.2 SMOTE

    对于少数类样本a, 随机选择一个最近邻的样本b, 然后从a与b的连线上随机选取一个点c作为新的少数类样本

    ros = SMOTE(random_state=42)  
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # # (714, 30) (714,)
    print(len(X_resampled), len(y_resampled))  # 714 714
    print(sorted(Counter(y_resampled).items()))  # [(0, 357), (1, 357)]
    

    3.3 SMOTEN

    若数据集仅由类别型特征构成,则可用SMOTEN

    ros = SMOTEN(random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (714, 30) (714,)
    print(len(X_resampled), len(y_resampled))  # 714 714
    print(sorted(Counter(y_resampled).items()))  # [(0, 357), (1, 357)]
    

    3.4 SMOTENC

    SMOTENC可处理分类特征的SMOTE
    只有当数据同时包含数值型和类别型特征时,SMOTENC才起作用

    ros = SMOTENC(categorical_features=[18, 19], random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (714, 30) (714,)
    print(len(X_resampled), len(y_resampled))  # 714 714
    print(sorted(Counter(y_resampled).items()))  # [(0, 357), (1, 357)]
    

    3.5 BorderlineSMOTE

    由于SMOTE算法随机选择少数类样本来生成新样本,没有考虑到所选少数类样本周围的情况,因此可能存在两个问题:
    所选的少数类样本周围也都是少数类样本,这样合成的新样本不会提供太多有用信息;
    所选的少数类样本周围都是多数类样本,这样的样本可能是噪声,生成的新样本可能会与周围多数类样本重叠。

    =========================================================
    因此BorderlineSMOTE算法在SMOTE算法上进行改进,只使用处于边界上的少数类样本来合成新样本,算法首先将所有少数类样本划分为三类,分别是:
    noise:噪声样本,即少数类样本的周围K个近邻都是多数类样本;
    danger:危险样本,即少数类样本的周围K个近邻中有一半及以上为多数类样本;
    safe:安全样本,即少数类样本的周围K个近邻中有一半以上为少数类样本。

    =========================================================
    BorderlineSMOTE算法只会从处于”danger“状态的样本中随机选择,然后用SMOTE算法产生新的样本。
    处于”danger“状态的样本代表靠近”边界“附近的少数类样本,而处于边界附近的样本往往更容易被误分类。
    因而 Border-line SMOTE 只对那些靠近”边界“的少数类样本进行人工合成样本,而 SMOTE 则对所有少数类样本一视同仁。

    =========================================================
    Border-line SMOTE 分为两种: Borderline-1 SMOTE 和 Borderline-2 SMOTE。
    Borderline-1 SMOTE 在合成样本时式中的x^ 是一个少数类样本
    Borderline-2 SMOTE 中的x^ 则是k近邻中的任意一个样本

    ros = BorderlineSMOTE(kind="borderline-1", random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (714, 30) (714,)
    print(len(X_resampled), len(y_resampled))  # 714 714
    print(sorted(Counter(y_resampled).items()))  # [(0, 357), (1, 357)]
    

    3.6 SVMSMOTE

    SVMSMOTE使用支持向量机分类器产生支持向量然后再生成新的少数类样本,然后使用SMOTE合成样本

    ros = SVMSMOTE(random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (714, 30) (714,)
    print(len(X_resampled), len(y_resampled))  # 714 714
    print(sorted(Counter(y_resampled).items()))  # [(0, 357), (1, 357)]
    

    3.7 KMeansSMOTE

    KMeansSMOTE原理:在使用SMOTE进行过采样之前应用KMeans聚类。
    KMeansSMOTE包括三个步骤:聚类、过滤和过采样。
    在聚类步骤中,使用k均值聚类为k个组。过滤选择用于过采样的簇,保留具有高比例的少数类样本的簇。
    然后,它分配合成样本的数量,将更多样本分配给少数样本稀疏分布的群集。
    最后,过采样步骤,在每个选定的簇中应用SMOTE以实现少数和多数实例的目标比率。

    ros = KMeansSMOTE(random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (719, 30) (719,)
    print(len(X_resampled), len(y_resampled))  # 719 719
    print(sorted(Counter(y_resampled).items()))  # [(0, 362), (1, 357)]
    

    3.8 ADASYN

    ADASYN自适应综合过采样,关注的是在那些基于K近邻分类器被错误分类的原始样本附近生成新的少数类样本

    ros = ADASYN(random_state=42)
    X_resampled, y_resampled = ros.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (715, 30) (715,)
    print(len(X_resampled), len(y_resampled))  # 715 715
    print(sorted(Counter(y_resampled).items()))  # [(0, 358), (1, 357)]
    

    4. 下采样

    4.1 RandomUnderSampler

    RandomUnderSampler随机下采样

    rus = RandomUnderSampler(random_state=42)
    X_resampled, y_resampled = rus.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (424, 30) (424,)
    print(len(X_resampled), len(y_resampled))  # 424 424
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 212)]
    

    4.2 ClusterCentroids

    ClusterCentroids每一个类别的样本都会用K-means算法的中心点来合成

    rus = ClusterCentroids(random_state=42)
    X_resampled, y_resampled = rus.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (424, 30) (424,)
    print(len(X_resampled), len(y_resampled))  # 424 424
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 212)]
    

    4.3 NearMiss

    NearMiss添加了一些启发式(heuristic)的规则来选择样本,version=1,2,3,3的结果和1,2不同,3的结果(277, 30) (277,) 277 277 [(0, 212), (1, 65)]

    rus = NearMiss(version=3)
    X_resampled, y_resampled = rus.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (424, 30) (424,)
    print(len(X_resampled), len(y_resampled))  # 424 424
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 212)]
    

    4.4 EditedNearestNeighbours

    EditedNearestNeighbours应用最近邻算法来编辑(edit)数据集, 找出那些与邻居不太友好的样本然后移除

    enn = EditedNearestNeighbours()
    X_resampled, y_resampled = enn.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (424, 30) (424,)
    print(len(X_resampled), len(y_resampled))  # 424 424
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 212)]
    

    4.5 RepeatedEditedNearestNeighbours

    RepeatedEditedNearestNeighbours重复基础的EditedNearestNeighbours算法多次

    renn = RepeatedEditedNearestNeighbours()
    X_resampled, y_resampled = renn.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (520, 30) (520,)
    print(len(X_resampled), len(y_resampled))  # 520 520
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 308)]
    

    4.6 AllKNN

    ALLKNN算法在进行每次迭代的时候, 最近邻的数量都在增加

    allknn = AllKNN()
    X_resampled, y_resampled = renn.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (520, 30) (520,)
    print(len(X_resampled), len(y_resampled))  # 520 520
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 308)]
    

    4.7 CondensedNearestNeighbour

    CondensedNearestNeighbour使用1近邻的方法来进行迭代, 来判断一个样本是应该保留还是剔除,具体算法步骤如下:

    将所有少数类样本放入集合C;从目标类(待下采样的类)中选择一个样本放入C,其余的该类样本放入集合S;逐样本遍历集合S,训练1近邻分类器,对S中的所有样本进行分类;将S中错误分类的样本加入C;重复上述过程直到没有再加入C中的样本

    cnn = CondensedNearestNeighbour(random_state=42)
    X_resampled, y_resampled = cnn.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (262, 30) (262,)
    print(len(X_resampled), len(y_resampled))  # 262 262
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 50)]
    

    4.8 OneSidedSelection

    OneSidedSelection 函数使用 TomekLinks 方法来剔除噪声数据(多数类样本)

    oss = OneSidedSelection(random_state=42)
    X_resampled, y_resampled = oss.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (495, 30) (495,)
    print(len(X_resampled), len(y_resampled))  # 495 495
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 283)]
    

    4.9 NeighbourhoodCleaningRule

    NeighbourhoodCleaningRule 算法主要关注如何清洗数据而不是筛选(considering)他们;
    因此, 该算法将使用EditedNearestNeighbours和 3-NN分类器结果拒绝的样本之间的并集

    ncr = NeighbourhoodCleaningRule()
    X_resampled, y_resampled = ncr.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (541, 30) (541,)
    print(len(X_resampled), len(y_resampled))  # 541 541
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 329)]
    

    4.10 InstanceHardnessThreshold

    InstanceHardnessThreshold是一种很特殊的方法,是在数据上运用一种分类器, 然后将概率低于阈值的样本剔除掉

    iht = InstanceHardnessThreshold(random_state=42)
    X_resampled, y_resampled = iht.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (427, 30)  (427,)
    print(len(X_resampled), len(y_resampled))  # 427 427
    print(sorted(Counter(y_resampled).items()))  # [(0, 212), (1, 215)]
    

    5. 混合采样

    5.1 SMOTEENN

    过采样与下采样结合

    smoteenn = SMOTEENN(random_state=42)
    X_resampled, y_resampled = smoteenn.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (621, 30)  (621,)
    print(len(X_resampled), len(y_resampled))  # 621 621
    print(sorted(Counter(y_resampled).items()))  # [(0, 307), (1, 314)]
    

    5.2 SMOTETomek

    过采样与下采样结合

    smotetomek = SMOTETomek(random_state=42)
    X_resampled, y_resampled = smotetomek.fit_resample(X, y)
    print(X_resampled, y_resampled, X_resampled.shape, y_resampled.shape, sep="\n")  # (696, 30)  (696,)
    print(len(X_resampled), len(y_resampled))  # 696 696
    print(sorted(Counter(y_resampled).items()))  # [(0, 348), (1, 348)]
    

    6. 切分数据

    这里的X,y对应乳腺癌数据集load_breast_cancer

    trainX, testX, trainY, testY = train_test_split(X, y, random_state=42)
    

    7. 集成采样

    7.1 BaggingClassifier

    from sklearn.ensemble import BaggingClassifier
    BaggingClassifier该分类器并不允许对每个数据集进行均衡. 因此, 在对不均衡样本进行训练的时候, 分类器其实是有偏的, 偏向于多数类

    bc = BaggingClassifier(base_estimator=DecisionTreeClassifier(), random_state=42)
    bc.fit(trainX, trainY)
    preY = bc.predict(testX)
    print(preY)
    print(confusion_matrix(testY, preY))
    

    7.2 BalancedBaggingClassifier

    BalancedBaggingClassifier 允许在训练每个基学习器之前对每个子集进行重抽样;
    简而言之, 该方法结合了EasyEnsemble 采样器与分类器(如BaggingClassifier)的结果
    BalaceBaggingClassifier使得在训练每个分类器之前,在每个子集上进行重采样,其参数与sklearn中的BaggingClassifier相同,除了增加了两个参数:sampling_strategy和replacement来控制随机下采样的方式

    bbc = BalancedBaggingClassifier(base_estimator=DecisionTreeClassifier(), random_state=42)
    bbc.fit(trainX, trainY)
    preY = bbc.predict(testX)
    print(preY)
    print(confusion_matrix(testY, preY))
    

    7.3 RUSBoostClassifier

    在执行boosting迭代之前执行一个随机下采样

    rbc = RUSBoostClassifier(base_estimator=DecisionTreeClassifier(), random_state=42)
    rbc.fit(trainX, trainY)
    preY = rbc.predict(testX)
    print(preY)
    print(confusion_matrix(testY, preY))
    

    7.4 EasyEnsembleClassifier

    EasyEnsemble 通过对原始的数据集进行随机下采样实现对数据集进行集成

    EasyEnsembleClassifier,即采用Adaboost
    计算弱分类器的错误率,对错误分类的样本分配更大的权值,正确分类的样本赋予更小权值。只要分类精度大于0.5即可做最终分类器中一员,弱分类器精度越高,权重越大。

    eec = EasyEnsembleClassifier(base_estimator=DecisionTreeClassifier(), random_state=42)
    eec.fit(trainX, trainY)
    preY = eec.predict(testX)
    print(preY)
    print(confusion_matrix(testY, preY))
    

    7.5 BalancedRandomForestClassifier

    在构建每棵树时使用平衡的bootstrap数据子集

    brfc = BalancedRandomForestClassifier(random_state=42)
    brfc.fit(trainX, trainY)
    preY = brfc.predict(testX)
    print(preY)
    print(confusion_matrix(testY, preY))
    

    感谢大佬,参考如下:
    python imblearn toolbox 解决数据不平衡问题(四)——联合采样、集成采样、其它细节
    机器学习中的样本不平衡学习
    抽样方法,采样方法 shuffle
    数据分析:使用Imblearn处理不平衡数据(过采样、欠采样)
    【机器学习】详解 使用 imblearn 应对类别不均衡
    数据预处理–上采样(过采样)与下采样(降采样)

    感谢大家的关注和支持,希望我写的文章能够让你们有收获。
    如有不足,还请各位多多指正!

    更多相关内容
  • 任何信号的基本上采样和下采样代码
  • 用c++代码实现上采样和下采样原理,环境是vs2015+opencv3.30。
  • 阅读教学 PDF 中链接的三个部分,了解有关下采样、上采样和重采样的理论背景的信息。
  • 今天小编就为大家分享一篇Python对数据进行插值和下采样的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 下采样程序

    2017-07-25 11:20:37
    完整的下采样程序可直接使用。
  • 最近用到了上采样下采样操作,pytorch中使用interpolate可以很轻松的完成 def interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None): r 根据给定 size 或 scale_factor,上...
  • 批量读取文件夹内特定规律名称的图片,对其进行上采样、下采样,注意路径、名称与实际对应
  • 高效视频编码中用于深度图压缩的边缘保留下采样/上采样
  • 原文地址:降采样,过采样,欠采样,子采样,下采样 作者:bluepig111111 降采样:2048HZ对信号来说是过采样了,事实上只要信号不混叠就好(满足尼奎斯特采样定理),所以可以对过采样的信号作抽取,即是所谓...
    降采样2048HZ对信号来说是过采样了,事实上只要信号不混叠就好(满足尼奎斯特采样定理),所以可以对过采样的信号作抽取,即是所谓的降采样
     
    
    采样频率从2048HZ32HZ 每隔64个样本,“??意思呢?
    降采样的频率怎么是变化的啊?我对降采样的原理不太熟悉。
     
    
    把过采样的数据,再间隔一定数再采一次的意思。过采样了,频谱分辨率比较低。
    
     
    
    那为什么还过采样啊,别使用2048HZ ,直接采样频率取为300HZ,不就免了降采样了吗?呵呵,这样问是不是很幼稚啊,我了解的少,见笑了:L
    
    在现场中采样往往受具体条件的限止,或者不存在300HZ的采样率,或调试非常困难等等。若R>>1,则Rfs/2就远大于音频信号的最高频率fm,这使得量化噪声大部分分布在音频频带之外的高频区域,而分布在音频频带之内的量化噪声就会相应的减少,于是,通过低通滤波器滤掉fm以上的噪声分量,就可以提高系统的信噪比。
    
     
    
    原采样频率为2048HZ,这时信号允许的最高频率是1024HZ(满足尼奎斯特采样定理),但当通过滤波器后使信号的最高频率为16HZ,这时采样频率就可以用到32HZ(满足尼奎斯特采样定理,最低为32HZ,比32HZ高都可以)。从2048HZ降到32HZ,便是每隔64个样本取1个样本。这种把采样频率降下来,就是降采样(downsample)。这样做的好处是减少数据样点,也就是减少运算时间,在实时处理时常采用的方法。
    

    过采样:

    过采样概述

      

      [转载]降采样,过采样,欠采样,子采样,下采样

    过采样是使用远大于奈奎斯特采样频率的频率对输入信号进行采样。设数字音频系统原来的采样频率为fs,通常为44.1kHz48kHz。若将采样频率提高到R×fsR称为过采样比率,并且R>1。在这种采样的数字信号中,由于量化比特数没有改变,故总的量化噪声功率也不变,但这时量化噪声的频谱分布发生了变化,即将原来均匀分布在0 ~ fs/2频带内的量化噪声分散到了0 ~ Rfs/2的频带上。右图表示的是过采样时的量化噪声功率谱。

      若R>>1,则Rfs/2就远大于音频信号的最高频率fm,这使得量化噪声大部分分布在音频频带之外的高频区域,而分布在音频频带之内的量化噪声就会相应的减少,于是,通过低通滤波器滤掉fm以上的噪声分量,就可以提高系统的信噪比。这时,过采样系统的最大量化信噪比为公式如右图.

      

      [转载]降采样,过采样,欠采样,子采样,下采样

    式中fm为音频信号的最高频率,Rfs为过采样频率,n为量化比特数。从上式可以看出,在过采样时,采样频率每提高一倍,则系统的信噪比提高3dB,换言之,相当于量化比特数增加了0.5个比特。由此可看出提高过采样比率可提高A/D转换器的精度。

      但是单靠这种过采样方式来提高信噪比的效果并不明显,所以,还得结合噪声整形技术。

    过采样技术原理介绍

      假定环境条件: 10ADC最小分辨电压1LSB  1mv

      假定没有噪声引入的时候, ADC采样上的电压真实反映输入的电压那么小于1mv的话,ADC0.5mv是数据输出为0

      我们现在用4倍过采样来提高1位的分辨率,

      当我们引入较大幅值的白噪声: 1.2mv振幅(大于1LSB), 并在白噪声的不断变化的情况下多次采样那么我们得到的结果

      真实被测电压 白噪声叠加电压 叠加后电压 ADC输出 ADC代表电压

      0.5mv 1.2mv 1.7mv 1 1mv

      0.5mv 0.6mv 1.1mv 1 1mv

      0.5mv -0.6mv -0.1mv 0 0mv

      0.5mv -1.2mv -0.7mv 0 0mv

      ADC的和为2mv, 那么平均值为: 2mv/4=0.5mv!!! 0.5mv就是我们想要得到的

      这里请留意我们平时做滤波的时候也是一样的操作喔那么为什么没有提高分辨率?是因为我们做滑动滤波的时候把有用的小数部分扔掉了因为超出了字长啊那么0.5取整后就是 结果和没有过采样的时候一样是 0 ,

      而过采样的方法时候是需要保留小数部分的所以用4个样本的值但最后除的不是4, 而是2! 那么就保留了部分小数部分而提高了分辨率!

      从另一角度来说变相把ADC的结果放大了2(0.5*2=1mv), 并用更长的字长表示新的ADC,

      这时候, 1LSB(ADC输出的位0)就不是表示1mv而是表示0.5mv, (ADC输出的位1)才是原来表示1mv的数据位,

      下面来看看一下数据的变化:

      ADC值相应位 9 8 7 6 5 4 3 2 1 0

      0.5mv测量值 0 0 0 0 0 0 0 0 0 0 0mv(10ADC的分辨率1mv,小于1mv无法分辨,所以输出值为0)

      叠加白噪声的4次过采样值的和 0 0 0 0 0 0 0 0 1 0 2mv

      滑动平均滤波2mv/4 0 0 0 0 0 0 0 0 0 0 0mv(平均数对改善分辨率没作用)

      过采样插值2mv/2 0 0 0 0 0 0 0 0 0 0 1 2mv/2=0.5mv, 将这个数作为11ADC那么代表就是0.5mv 这里我们提高了1位的ADC分辨率 

      这样说应该就很简单明白了吧其实多出来的位上的数据是通过统计输入量的分布计算出来的,

      而不是硬件真正分辨率出来的引入噪声并大于1LSB, 目的就是要使微小的输入信号叠加到ADC能识别的程度(ADC最小分辨率).

      理论来说如果ADC速度够快可以无限提高ADC的分辨率这是概率和统计的结果

      但是ADC的采样速度限制过采样令到最后能被采样的信号频率越来越低,

      就拿stm32ADC来说, 12ADC, 过采样带来的提高和局限

      分辨率 采样次数 每秒采样次数

      12ADC 1 1M

      13ADC 4 250K

      14ADC 16 62.5K

      15ADC 64 15.6K

      16ADC 256 3.9K

      17DC 1024 976

      18ADC 4096 244

      19ADC 16384 61

      20ADC 65536 15

    要记住这些采样次数还未包括我们要做的滑动滤波。

    过采样定义:就是用高于nyquist频率进行采样,好处是可以提高信噪比,缺点是处理数据量大 

            直观上讲:采样后的信号是原来的信号 频域延拓叠加,限带信号通常是离中心频率越远,幅度越低,因此采样率越高混叠的情况越小

    过采样目的就是要改变的噪声的分布,减少噪声在有用信号的带宽内,然后在通过低通滤波器滤除掉噪声,达到较好的信噪比,一般用在sigma-deltaDAC 或者ADC里面 
    过采样作用:能将噪声扩展到更高的频率,通过低通滤波器后,可使得基带内的SNR提高 
    过采样意义:1.提高时域分辨力从而获得更好的时域波形
    2.提高滤波器的处理增益,当在频域上滤波时,滤波器的设计变得更容易
    3.提高信噪比,匹配滤波时更好地收集波形能量
    4.抑制镜像,使上变频更容易,降低对后级DA转换的保持时间要求
    5.需要fractional sampling timing时是必需的
    过采样应用:D/A转换,但不一定非要过采样,过采样的技术一般用在低速(几十K到数M)高精度(如16bit 18bit .....)的情况。DA过采样可以用线性插值实现。 

    相关讨论:OFDM系统IFFT插零的相关讨论
    s/p之后的OFDM符号,在进行IFFT时一般都进行中间插零操作,如有效载波是64个,插零后变成128个。 
    这样造成的直观问题是N增大,1/NT减小,对doppler频移的抵抗能力减弱?? 
    是否可以这样理解呢? 

    补零有几种: 
    1、头上的是zero-pad,一种prefix 
    2、空闲的子载波补齐2的整数次幂 
    3、中间补零从时域上看是过采样 
    OFDM技术原理与应用》一书中,讲到OFDM的采样问题,有如下的解释: 
    T为采样间隔得到的时域采样信号的傅立叶变换是由时域连续信号的傅立叶变化周期重复构成的,其重复周期是1/T。如果对时域信号实施p倍过采样,即采样间隔变为T/p,则其相位的傅立叶变换的重复周期就会变为p/T,而时域连续信号的频谱宽度又保持不变,因此从频域来看,也相当于在连续信号的带宽之外补零,而在IFFT运算中,相当于在频域数据中间插入零。 

    这个问题实际上应该倒过来理解. 
    首先,假定系统的的带宽为1M,子载波间隔为100k,因此子载波个数为10,采用10长度IFFT后需要采用一个较好的低通滤波器将1M之外的信号旁瓣过滤,成本较高因此在实际系统中通常将子载波数增加到20,但是将1M之外的子载波信号置零,这样可以使用一个低成本的低通滤波器得到1M带宽的传输信号了.对于MATLABIFFT变换而言,将高频段信号置零等效于将序列中间部分补零哦 


    1、插0是为了过采样 
    2、插0后,每个子载波的带宽将减小(如果不是这样,插0将没有任何意义)。 
    “ 首先,假定系统的的带宽为1M,子载波间隔为100k,因此子载波个数为10,采用10长度IFFT后需要采用一个较好的低通滤波器将1M之外的信号旁 瓣过滤,成本较高因此在实际系统中通常将子载波数增加到20,但是将1M之外的子载波信号置零,这样可以使用一个低成本的低通滤波器得到1M带宽的传输信号了.对于 MATLABIFFT变换而言,将高频段信号置零等效于将序列中间部分补零哦!” 

    低成本的低通滤波器得到1M带宽的传输信号?较好的低通滤波器将1M之外的信号旁瓣过滤
    只要需过滤的信号带宽相同,所需要的滤波器的要求就是相同的。 
    0的目的就是把1M的信号压缩,使之带宽小于1M,使得信号收到相邻带宽信号的干扰程度降低,当然这样做得结果就是受多普勒频移影响较大。插零值处理,可以使得ifft后的D/A转换具有更良好的频域特性,这也就是过采样技术带来的好处。 
    在仿真中这样处理,也可以对数字信号的估计量更准确地逼近连续信号的估计量,比如信号功率,比如峰均比。

    欠采样:

    采样定理:
    
    当采样频率fs.max大于信号中,最高频率fmax2倍时,即:fs.max>=2fmax,则采样之后的数字信号完整地保留了原始信号中的信息,一般取2.56-4倍的信号最大频率;采样定理又称奈奎斯特定理。
    
     
    
    欠采样是在测试设备带宽能力不足的情况下,采取的一种手段,相当于增大了测试设备的带宽,从而达到可以采样更高频率信号的能力。
    

    要想确保数据采集系统的结果准确可靠,设计人员必须首先回答下面的问题:我们如何知道输入基带的最高频率?输入信号自身就是带限信号吗?噪声会对输入信号造成什么样的影响?接地回路或者从相邻电路板接收的噪声会对低电平信号产生干扰吗?这些噪声是窄带信号还是宽带信号?如果不考虑上述因素的影响,仅仅只有最理想状态的话,我们设计的数据采集系统会有问题吗?欠采样技术 - 生活点滴 - yxg的博客

    实际上,如果不能减少上述不利因素的影响,肯定会出现混叠现象。简单地说,混叠现象会产生错误的信号,而系统如果对这些错误的信号进行处理,就会得到不正确的结果。

     

    混叠信号可用时域和频域图来描述。从图1a中可以看到,同样的数据采样点可能对应多个不同的时域波形;而在图1b的频域图中,可看到混叠现象导致信号重叠,或者说频谱交叉。在数据处理过程中消除混叠的唯一途径就是采用低通滤波器,它对低混叠频率的衰减作用可以满足我们的动态范围要求。

     

    应采用抗混叠滤波器以确保输入基带信号和噪声在一定频带范围内,只有这样在采样过程中产生的混叠才能满足动态范围要求。

     

    2是一个适于处理信号频宽不超过4MHz的抗混叠滤波器,它是一种具有80dB最小带外抑制比的高阶椭圆滤波器,第一个抑制点出现在6MHz,随后是典型的椭圆形反弹响应,并始终维持低于80dB

    为了能够处理带宽为4MHz的信息,采样频率应该设为10MHz而不是奈奎斯特定律表明的8MHz。采用比理论值大的采样频率仅仅只是说明了一个事实,即不存在理想化具有无穷衰减率的低通滤波器。在这个例子中,临界折叠频率为10-46MHz,而不是4MHz,这是该滤波器衰减满足80dB要求的最小频率,这样就保证了频宽从DC4MHz都没有混叠。欠采样技术 - 生活点滴 - yxg的博客

    响应如图2所示的滤波器可以通过两种途径实现:无源LC滤波器,或者有源RC滤波器,两种实现方法都要在A/D转换器前加上一个模拟滤波器。可否不要这个模拟滤波器而在A/D转换完成后再通过一个数字滤波器呢?将数字滤波器作为我们数字信号处理系统的一部分是完全可以的,但是在进行A/D转换之前我们仍然需要一个抗混叠滤波器,因为如果混叠现象发生在采样过程之中,其后的数字滤波将不能够把它消除。

     

    通常用于欠采样的时钟频率有好几种,虽然该模型能显示所有正确频率设计,但还需要注意以下几个重要问题:

    ·有的A/D转换器只适用于欠采样应用,而有的只适用于基带采样,使用前须仔细阅读厂商提供的产品说明。

    ·A/D转换器的模拟通道在处理带通信号输入频率时,其失真或噪声必须尽可能小,因此最好在输入端加一个耦合变换器。

    ·在带通输入频率较高时,位于A/D转换器前端的采样和保持放大器质量非常重要,一般说来,有必要采用一个额外的外部高性能采样保持电路。

    ·频率范围外的信号或噪声必须尽可能小,因为它们将会混叠到输出频谱中(3),增加一个输入带通滤波器有助于减少其影响。

    ·采样时钟信号的抖动和相位噪声将严重降低欠采样的性能,最好使用高质量的晶振,并简单地直接连接到A/D转换器上。

    欠采样是软件无线电应用中一个非常有用的工具,但是必须十分仔细和小心才能获得良好的性能。

    子采样:

    图像子采样

    对彩色电视图像进行采样时,可以采用两种采样方法。一种是使用相同的采样频率对图像的亮度信号和色差信号进行采样,另一种是对亮度信号和色差信号分别采用不同的采用频率进行采样。如果对色差信号使用的采样频率比对亮度信号使用的采样频率低,这种采样就称为图像子采样(subsampling)

    子采样的基本根据是人的视觉系统所具有的两条特性,一是人眼对色度信号的敏感程度比对亮度信号的敏感程度低,利用这个特性可以把图像中表达颜色的信号去掉一些而使人不察觉;二是人眼对图像细节的分辨能力有一定的限度,利用这个特性可以把图像中的高频信号去掉而使人不易察觉。子采样就是利用这个特性来达到压缩彩色电视信号。

    目前使用的有如下几种子采样格式。

    (一)4:4:4 YCbCr格式

    这种采样格式不是子采样格式,它是指在每条扫描线上每4个连续的采样点取4个亮度Y样本、4个红色差Cr样本和4个蓝色差Cb样本,这就相当于每个像素用3个样本表示(图07-04-3625扫描行系统)。对于消费类和计算机应用,每个分量的每个样本精度为8比特;对于编辑类应用,每个分量的每个样本的精度为10比特。因此每个像素的样本需要24比特或者30比特。 

    [转载]降采样,过采样,欠采样,子采样,下采样

    07-04-3   4:4:4子采样格式

    (二)4:2:2 YCbCr 格式

    这种子采样格式是指在每条扫描线上每4个连续的采样点取4个亮度Y样本、2个红色差Cr样本和2个蓝色差Cb样本,平均每个像素用2个样本表示(图07-04-4625扫描行系统)。对于消费类和计算机应用,每个分量的每个样本的精度为8比特;对于编辑类应用,每个分量的每个样本精度为10比特。因此每个像素的样本需要16比特或者20比特。在帧缓存中,每个样本需要16比特或者20比特。显示像素时,对于没有CrCbY样本,使用前后相邻的CrCb样本进行计算得到的CrCb样本。

    [转载]降采样,过采样,欠采样,子采样,下采样

    07-04-4   4:2:2子采样格式

    (三)4:1:1 YCbCr 格式

    这种子采样格式是指在每条扫描线上每4个连续的采样点取4个亮度Y样本、1个红色差Cr样本和1个蓝色差Cb样本,平均每个像素用1.5个样本表示(图07-04-5625扫描行系统)。显示像素时,对于没有CrCbY样本,使用前后相邻的CrCb样本进行计算得到该Y样本的CrCb样本。这是数字电视磁带(DVC digital video cassette)上使用的格式。

    [转载]降采样,过采样,欠采样,子采样,下采样

    07-04-5   4:1:1子采样格式

    (四)4:2:0 YCbCr 格式

    这种子采样格式是指在水平和垂直方向上每2个连续的采样点上取2个亮度Y样本、1个红色差Cr样本和1个蓝色差Cb样本,平均每个像素用1.5个样本表示。在实际实现时,有两种略为不同的形式。

    (1) H.261H.263MPEG-1

    H.261 H.263MPEG-1使用的子采样格式中,在水平方向的2个样本和垂直方向上的2Y样本共4个样本有1Cb样本和一个Cr样本,并且子采样在水平方向上有半个像素的偏移(图07-04-6625扫描行系统)。如果每个分量的每个样本精度为8比特,在帧缓存中每个样本就需要12比特。

    [转载]降采样,过采样,欠采样,子采样,下采样

    07-04-6   MPEG-1等使用的4:2:0子采样格式

    (2) MPEG-2

    MPEG-2使用的子采样格式中,在水平方向的2个样本和垂直方向上的2Y样本共4个样本有1Cb样本和一个Cr样本,但子采样在水平方向上没有半个像素的偏移(图07-04-7625扫描行系统)。

    [转载]降采样,过采样,欠采样,子采样,下采样

    07-04-7   MPEG-2的空间样本位置

    07-04-8用图解的方法对以上4种子采样格式作了说明。

    [转载]降采样,过采样,欠采样,子采样,下采样

    07-04-8   彩色图像YCbCr样本空间位置

    下采样:

    下采样

      定义:对于一个样值序列间隔几个样值取样一次,这样得到新序列就是原序列  的下采样。

      采样率变化主要是由于信号处理的不同模块可能有不同的采样率要求。下采样相对于最初的连续时间信号而言,还是要满足采样定理才行,否则这样的下采样会引起信号成分混叠。

      下采样就是抽取,是多速率信号处理中的基本内容之一。在不同应用场合,下采样可以带来许多相应的好处。就以在最常见的数字接收机中为例,最后要得到的基带信号的采样率等于符号速率,这个速率是比较低的,但通常的做法并不是直接以这个采样率对模拟信号进行采样,而是采用高的多(几十甚至上百倍)的采样率,这样可以提高采样得到的信号的信噪比,然后再用数字的方法对信号进行多级的滤波和抽取,直到最后信号的采样率与符号速率相等。这样处理可以获得的信噪比增益为最初采样率与最后输出信号采样率之比。

      不同的采样率之前,是有一个带宽与该采样率对应的滤波器的,

      采样率越高,滤波器带宽就越大,对于宽带噪声而言(噪声带宽高于最高的采样率),

      通过的噪声功率就越高(噪声功率即功率谱密度乘上带宽,也即是每采样值中噪声分量的平方取均值。)

      信号功率在采样前后始终是没有变化的(信号功率即是每采样值中信号分量的平方取均值)。

      对于窄带噪声或者窄带干扰(噪声或者干扰带宽低于最高采样率),下采样获得信噪比增益

      为最初采样率与最后输出信号采样率之比的这样结论可能是没有的。

      或者说信噪功率比增益提高没有这么多。

    对于一个样值序列间隔几个样值取样一次,这样得到新序列就是原序列的下采样。采样率变化主要是由于信号处理的不同模块可能有不同的采样率要求。下采样相对于最初的连续时间信号而言,还是要满足采样定理才行,否则这样的下采样会引起信号成分混叠。 这些东西在离散时间信号处理上都有的,有时候查书可能比网上问效果还好些。

    In signal processing, downsampling (or "subsampling") is the process of reducing the sampling rate of a signal. This is usually done to reduce the data rate or the size of the data. 

    The downsampling factor (commonly denoted by M) is usually an integer or a rational fraction greater than unity. This factor multiplies the sampling time or, equivalently, divides the sampling rate. For example, if compact disc audio is downsampled by a factor of 5/4 then the resulting sampling rate goes from 44,100 Hz to 35,280 Hz, which reduces the bit rate from 1,411,200 bit/s to 1,128,960 bit/s.

    Since downsampling reduces the sampling rate, the Shannon-Nyquist sampling theorem criterion is maintained. If the sampling theorem is not satisfied then the resulting digital signal will have aliasing. To ensure that the sampling theorem is satisfied, a low-pass filter is used as an anti-aliasing filter to reduce the bandwidth of the signal before the signal is downsampled. 

    Note that the anti-aliasing filter must be a low-pass filter in downsampling. This is different from sampling a continuous signal, where either a low-pass filter or a band-pass filter may be used. 

    Remark: A bandpass signal, i.e. a band-limited signal whose minimum frequency is different from zero, can be downsampled avoiding superposition of the spectra if certain conditions are satisfied

    抛开教科书,从实现的角度来讲:在接收端,采样同步后,符号判决时就要对过采样的数据进行抽取(以符号周期为单位)。从原理上来讲:看书吧。 下采样就是抽取,是多速率信号处理中的基本内容之一。在不同应用场合,下采样可以带来许多相应的好处。就以在最常见的数字接收机中为例,最后要得到的基带信号的采样率等于符号速率,这个速率是比较低的,但通常的做法并不是直接以这个采样率对模拟信号进行采样,而是采用高的多(几十甚至上百倍)的采样率,这样可以提高采样得到的信号的信噪比,然后再用数字的方法对信号进行多级的滤波和抽取,直到最后信号的采样率与符号速率相等。这样处理可以获得的信噪比增益为最初采样率与最后输出信号采样率之比。

    个人觉得这个结论其实是基于这样的前提假设:
    不同的采样率之前,是有一个带宽与该采样率对应的滤波器的,
    采样率越高,滤波器带宽就越大,对于宽带噪声而言(噪声带宽高于最高的采样率),
    通过的噪声功率就越高(噪声功率即功率谱密度乘上带宽,也即是每采样值中噪声分量的平方取均值。)
    信号功率在采样前后始终是没有变化的(信号功率即是每采样值中信号分量的平方取均值)。
    对于窄带噪声或者窄带干扰(噪声或者干扰带宽低于最高采样率),下采样获得信噪比增益
    为最初采样率与最后输出信号采样率之比的这样结论可能是没有的。              
    或者说信噪功率比增益提高没有这麽多。

     

     

    下采样不是欠采样,下采样的采样频率相对于原始的信号而言还是满足了采样定理的。

     

    通常在抽取之前总会先经过一个抗混叠滤波器的,所以我就没有再专门提它。另外如果假定噪声是高斯白噪声的话这个处理增益的计算是正确的。

    个人理解:

    下采样也就是带通欠采样,我们知道的通常意义上的Nyquist采样是过采样,它规定采样速率是信号最高频率的两倍以上,而带通欠采样采样频率则只需信号带宽的两倍即可,带通欠采样能把高频处的带通信号采样到较低的频率处,采样使信号的频谱在Nyquist区间内折叠翻转,在低频处会有频谱的镜像,把这一部分频谱滤出来,这样就实现了下变频,便于滤波器的设计和后续插值、抽取的处理。

    欠采样怎麽定义的?哪位网友给出一下?我怎麽感觉不该是这样的?
    landau
    pollak定理告诉我们:对于一个带限B的信号,它在(0T)间的波形可以用2BT1
    正交基去近似表示它,也即是单位时间上的样值的平均个数为(2BT1)/T
    采样定理其实就是landaupollak定理的一个特列。从landaupollak定理看带通采样也就
    很好理解了:频带上限、下限都不重要,重要的是带宽。
    当然,在带通采样时,可能需要很巧妙地设计采样点(正交基)才能够
    使得仅仅需要2BT1个样值就能够重建原来(0T)间的波形。           
    我个人觉得:
    欠采样是未满足采样定理的,也即是用来表示信号的正交基数目少于2BT1
    即单位时间上的样值的平均个数小于(2BT1)/T

    这时应该不是简单的抽取吧,因为也许之前的采样中任何一个都不对应于各个符号
    波形的最佳采样时刻(比如:匹配滤波器定时不准确的情况),所以可能还有个内插
    之后再抽取吧?
    你的采样同步隐含了这个内插?

    上采样:

    上采样

      所谓采样就是采集模拟信号的样本。 采样是将时间上、幅值上都连续的信号,在采样脉冲的作用下,转换成时间、幅值上离散的信号。所以采样又称为波形的离散化过程。 普通的奈奎斯特采样定理的前提是频率受限于(0f)的带限信号。

      通常采样指的是下采样,也就是对信号的抽取。其实,上采样和下采样都是对数字信号进行重采,重采的采样率与原来获得该数字信号(比如从模拟信号采样而来)的采样率比较,大于原信号的称为上采样,小于的则称为下采样。上采样的实质也就是内插或插值

         上采样是下采样的逆过程,也称增取样(Upsampling)或内插(Interpolating[1]。增取样在频分多路复用中的应用是一个很好的例子。如果这些序列原先是以奈奎斯特频率对连续时间信号取样得到的,那么在进行频分多路利用之前必须对它们进行上采样。

     

     

    1、                            过采样是采样频率大于最高频率的两倍(奈奎斯特采样率),实际对低通信号采样也是2.5倍左右过采样;
    2
    、欠采样就是小于奈奎斯特采样率,应该就指带通采样吧;
    3
    、上采样和下采样其实对数字信号进行重采,重采的采样率与原来获得该数字信号(比如从模拟信号采样而来)的采样率比较,大于上采样,小于下采样。

    2、          上采样和下采样分别就是内插和抽取。

     

    展开全文
  • 一种非常新颖的多角度多尺度变换,轮廓变换的 改进,非下采样轮廓变换,可用于图像处理的多个方面
  • matlab 图像下采样源码

    热门讨论 2013-05-30 09:39:53
    matlab 图像下采样代码,给定原始图像和下采样比例,得到下采样之后的图像矩阵
  • 下采样器块的表征可以通过以下公式完成: y(n)=x(nM) 句法: [y ny]=下采样器(x,n,M) x 是由 nL 指定的索引上的输入序列是下采样率。它忽略第 k 个样本和第 (k+M) 个样本之间的 (M-1) 个样本。 y 是 ny 指定的...
  • 图像处理笔记1一上采样与下采样

    千次阅读 2022-03-18 19:55:37
    (800, 800)) end_time = time.time() print('总耗时为:{} s'.format(end_time - start_time)) cv2.imshow('bilinear interp', dst) cv2.waitKey() 注意事项: 插值不仅仅用于上采样,也可以用于下采样(采样完后,...

    常用的插值方法

    1.最近邻插值(简单)

    顾名思义,最近邻,跟哪个邻居最近,那插入的这个像素值,就和这个最近的邻居像素一样。是的,一模一样,copy 像素。

    • 优点:计算量少,效率高、速度快
    • 缺点:直接插值,像素无过度,易形成锯齿状

    最近邻差值代码实现:

    import cv2
    import numpy as np
    import time
    
    def nearest_interpolation(img, out_dim):
        """
        最近邻插值
        :param img:原图
        :return:插值后的图
        """
        src_h, src_w, src_channel = img.shape
        dst_h, dst_w = out_dim[1], out_dim[0]
        print("src_h, src_w = ", src_h, src_w)
        print("dst_h, dst_w = ", dst_h, dst_w)
        if src_h == dst_h and src_w == dst_w:
            return img.copy()
        emptyImage = np.zeros((dst_h, dst_w, src_channel), np.uint8)
    
        # 求新尺寸与旧尺寸间的比值(x-w, y-h)
        scale_x = dst_w / src_w
        scale_y = dst_h / src_h
        for j in range(dst_h):
            for i in range(dst_w):
                # 找到新点坐标对应的最近位置
                x = int(i/scale_x)
                y = int(j/scale_y)
                # 将距离新坐标最近原像素点的像素值,赋值给新点,作为新点像素值
                emptyImage[i, j] = img[x, y]
        return emptyImage
    
    if __name__ == '__main__':
        org_img = cv2.imread("lenna.png")
        start_time = time.time()
        dst = nearest_interpolation(org_img, out_dim=(800, 800))
        end_time = time.time()
        print('总耗时为:{} s'.format(end_time - start_time))
    
        cv2.imshow("org_image", org_img)
        cv2.imshow("nearest interp", dst)
    
        cv2.waitKey()
    

    2.单线性插值(简单,只在一个方向上进行插值)

    单线性插值,顾名思义,有两个关键的词

    • 线性

    根据下面的图,已知(x0,y0)和(x1, y1)点的像素坐标,求(x, y)的像素坐标,在一条直线上,就是一个线性的关系。相似三角形,直接求(x, y)点对应的坐标。

    不再是简单粗暴的copy了,而是稍微动了下脑子,做了一次线性插值,类似于0和2像素值的中点,插入一个像素值,那就是1

    评价:失真相比于最近邻插值,失真会小一点。
    单线性插值

    3.双线性插值(复杂,常用,重要)

    每个方向做单线性插值,再做插值,记为双线性插值。
    在这里插入图片描述计算方式:

    计算公式代码实现:

    import numpy as np
    import cv2
    import time
    
    def bilinear_interpolation(img, out_dim):
        """
            双线性插值
            :param img:原图
            :return:插值后的图
        """
        src_h, src_w, channel = img.shape
        dst_h, dst_w = out_dim[1], out_dim[0]
        print("src_h, src_w = ", src_h, src_w)
        print("dst_h, dst_w = ", dst_h, dst_w)
        if src_h == dst_h and src_w == dst_w:
            return img.copy()
        dst_img = np.zeros((dst_h, dst_w, channel), dtype=np.uint8)
        scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_h
    
        for i in range(channel):
            for dst_y in range(dst_h):
                for dst_x in range(dst_w):
     
                    # find the origin x and y coordinates of dst image x and y
                    # use geometric center symmetry (几何中心对称)
                    # if use direct way, src_x = dst_x * scale_x
                    src_x = (dst_x + 0.5) * scale_x - 0.5
                    src_y = (dst_y + 0.5) * scale_y - 0.5
     
                    # 找出将被用来计算插值的点的坐标
                    src_x0 = int(np.floor(src_x))
                    src_x1 = min(src_x0 + 1, src_w - 1)
                    src_y0 = int(np.floor(src_y))
                    src_y1 = min(src_y0 + 1, src_h - 1)
     
                    # calculate the interpolation, x2-x1=1; y2-y1=1.忽略分母
                    temp0 = (src_x1 - src_x) * img[src_y0, src_x0, i] + (src_x - src_x0) * img[src_y0, src_x1, i]
                    temp1 = (src_x1 - src_x) * img[src_y1, src_x0, i] + (src_x - src_x0) * img[src_y1, src_x1, i]
                    dst_img[dst_y, dst_x, i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)
     
        return dst_img
     
    if __name__ == '__main__':
        img = cv2.imread('lenna.png')
        start_time = time.time()
        dst = bilinear_interpolation(img, (800, 800))
        end_time = time.time()
        print('总耗时为:{} s'.format(end_time - start_time))
        cv2.imshow('bilinear interp', dst)
        cv2.waitKey()
    

    注意事项:

    • 插值不仅仅用于上采样,也可以用于下采样(采样完后,丢失原来像素点),以上采样为主
    • 先做中心对齐(原图像与采样后图像的中心对齐),再做双线性插值,避免出现图像失真。(未做中心对齐,是以左上角为起始点的,导致部分像素不参与插值训练)
    • 中心对齐操作非必须,不是插值前的必须步骤
    • 最近邻插值,没必要做中心对齐
    展开全文
  • 下采样

    2019-01-15 12:06:02
    下采样,通俗地讲就是隔几个数采样一个点 下采样过程令y(n)=x(Dn)   例如一个离散序列本来长这样   如果系数D=2,那么下采样之后得到的结果就是:      ...

    下采样,通俗地讲就是隔几个数采样一个点

    下采样过程令y(n)=x(Dn)

     

    例如一个离散序列本来长这样

     

    如果系数D=2,那么下采样之后得到的结果就是:

     

     

     

    展开全文
  • 图像下采样算法

    2012-06-21 15:10:42
    实现图像、影像下采样,采样方法有最邻近采样法、二次插值法、双三次卷积法。matlab实现。
  • 多层医学图像像素点不相同情况的重新采样算法,每格两个像素点进行重采样
  • 下采样与上采样

    千次阅读 2021-07-12 10:47:50
    一、下采样 概念:下采样(subsampled),又称为降采样(downsampled)。可以通俗地理解为缩小图像,减少矩阵的采样点数。 方法:(1)最常用隔位取值,每行每列每隔k个点取一个点(2)合并区域:每(row/k)*(col/k...
  • 下采样和上采样

    万次阅读 多人点赞 2021-11-21 13:46:09
    1、下采样的作用是什么?通常有哪些方式? 下采样层有两个作用,一是减少计算量,防止过拟合;二是增大感受野,使得后面的卷积核能够学到更加全局的信息。 下采样的方式主要有两种: 1、采用stride为2的池化层,如...
  • 注意到奈奎斯特对于偶数和奇数信号长度(显式与隐式镜像)的行为有何不同,我们产生了 4 种上采样情况:{偶数到奇数,偶数到偶数,奇数到偶数,奇数到奇数}和同样的 4 个下采样情况:{偶数到奇数,偶数到偶数,奇数...
  • 数字信号中的上采样和下采样

    千次阅读 2022-01-07 14:44:13
    数字信号处理中的上采样和下采样~
  • 对 fftn 工作的任何数据执行 ND FFT 插值。 将通过零填充进行上采样,通过截断高频进行下采样,或按维度组合上采样和下采样以允许任意整形。
  • python 下采样和上采样

    千次阅读 2020-10-28 16:23:27
    由于工作数据量较大,训练模型很少直接单机python,一般都采用SparkML,最近把SparkML的工作使用python简单的写了一下,先写个上下采样,最终目的是为了让正负样本达到均衡(有人问:正负样本必须是1:1吗?...
  • Pytorch:上采样、下采样

    千次阅读 2021-01-18 17:55:23
    缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。 放大图像(或称为上采样(upsampling)或图像插值(interpolating)...
  • 上采样,重采样和下采样,降采样

    千次阅读 2019-10-11 20:05:56
    一.上采样(重采样) 1.上采样就是重采样也就是放大图像,通常使用的目的是 (1)使图片达到更高的分辨率 ...无论缩放图像(下采样)还是放大图像(上采样),采样方式有很多种。如最近邻插值,双线性插值,均值插值...
  • 图像语义分割中的上采样和下采样1. 下采样和上采样的基本概念 最近在看到一篇论文中用到了transposed convolution,并出现了upsampling等概念,表示很迷。那么什么是upsampling ? 1. 下采样和上采样的基本概念 ...
  • 图像的上采样与下采样

    千次阅读 2021-06-27 23:30:39
    上采样: 别名:放大图像,也叫图像插值。 目的:放大原图,从而可以显示在更高分辨率的显示设备上。 缺点:会对图像的质量造成影响,并没有带来更多的信息。 ...插值方法有很多,比如均值...下采样: 别名:缩小图像
  • 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是...
  • 1. 过采样和欠采样 这是两种解决分类训练过程中数据量不...2. 上采样和下采样 卷积神经网络(CNN)是由卷积层/池化层/激活层……组成的“自上而下”的多层网络,原始图像从CNN顶层输入,到底层生成特征图,这个过程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 320,520
精华内容 128,208
关键字:

下采样