Python 将灰度图像规格化为一个值

Python 将灰度图像规格化为一个值,python,image-processing,Python,Image Processing,有没有一种方法可以规范化灰度图像,使其具有预定义的平均值。假设我们得到一个平均值为142的图像(最大值为250,最小值为10),我们将对其进行归一化,使其平均值为100。整个图像会变暗,最小值和最大值也会改变。实现这一点的最佳方法是什么?您可以读取灰度图像,并像MinMaxScaler sklearn操作一样直接将最小最大值应用于图像 im = cv2.imread(file,0) ((im/255)*90)+10 输出: 或 使用来变换图像 from sklearn.preprocessin

有没有一种方法可以规范化灰度图像,使其具有预定义的平均值。假设我们得到一个平均值为142的图像(最大值为250,最小值为10),我们将对其进行归一化,使其平均值为100。整个图像会变暗,最小值和最大值也会改变。实现这一点的最佳方法是什么?

您可以读取灰度图像,并像MinMaxScaler sklearn操作一样直接将最小最大值应用于图像

im = cv2.imread(file,0)
((im/255)*90)+10
输出:

使用来变换图像

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(10,100))
scaler.fit(im)
scaler.transform(im)

您可以读取灰度图像,并像MinMaxScaler sklearn的操作一样,将直接最小最大值应用于图像

im = cv2.imread(file,0)
((im/255)*90)+10
输出:

使用来变换图像

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(10,100))
scaler.fit(im)
scaler.transform(im)

您可以使用直接乘法来实现:

import numpy as np

# Make 64 noise samples with mean=142, sigma=50
s = np.random.normal(142, 50, 64) 

看起来是这样的:

array([108.96793075, 122.56604336,  52.92948494, 211.88597561,
       201.75694121, 127.03699257, 169.63376672, 151.38689085,
        88.50751644, 180.42261676, 148.06044352, 113.02992937,
       128.68514242, 171.55551377, 182.72483817, 127.008611  ,
       192.63588333, 154.29289467,  95.42692049, 168.35000286,
       101.22705089, 111.03725683, 110.5901968 , 185.42039232,
       144.03267223, 178.25385364, 157.65533049, 142.71266293,
       123.6252744 , 136.0834919 , 157.04318249, 164.20554021,
       181.80931254, 125.869104  ,  65.63487663, 158.02223726,
        91.04841987,  41.05017344, 175.60718802, 273.45938051,
        82.37393654, 188.86067814, 154.37552451, 173.63709343,
       106.49434825, 110.5845771 ,  87.71306659, 150.19152982,
       238.95739708, 152.91382848, 210.96731605, 154.80451484,
       156.14301742, 157.31710985, 170.80328144, 122.48376855,
       187.7631208 , 148.40453789,  80.31133945,  97.093196  ,
       149.19437508, 140.4912321 , 278.1623903 , 131.15185917])

In [53]: s.min(), s.max(), s.mean()                                                           
Out[53]: (41.050173444195025, 278.1623902968886, 146.1319527357261)
array([ 74.56817534,  83.87354105,  36.22033645, 144.99633492,
       138.06490465,  86.93306987, 116.08259764, 103.59602264,
        60.56684714, 123.46554835, 101.31969138,  77.34785395,
        88.06092029, 117.39767419, 125.04098847,  86.91364799,
       131.82324586, 105.58463894,  65.30188552, 115.2041013 ,
        69.27099036,  75.98424215,  75.67831315, 126.88559131,
        98.56343498, 121.98143548, 107.8855976 ,  97.66013542,
        84.59838665,  93.12370728, 107.46669674, 112.36799149,
       124.41448235,  86.13386849,  44.91480159, 108.13667668,
        62.30562048,  28.09116875, 120.17028769, 187.13181846,
        56.36955847, 129.23982374, 105.64118362, 118.82212629,
        72.8754706 ,  75.67446752,  60.02319476, 102.77802152,
       163.52166149, 104.64092597, 144.3676842 , 105.93474729,
       106.85070205, 107.65414881, 116.88291181,  83.81723932,
       128.48875095, 101.55515964,  54.9580964 ,  66.44213958,
       102.09565552,  96.13998135, 190.35014936,  89.74892672])

In [59]: r.min(), r.max(), r.mean()                                                           
Out[59]: (28.091168752416973, 190.3501493611971, 100.0)

现在将平均值转换为100:

r = s * 100./s.mean()

现在看起来是这样的:

array([108.96793075, 122.56604336,  52.92948494, 211.88597561,
       201.75694121, 127.03699257, 169.63376672, 151.38689085,
        88.50751644, 180.42261676, 148.06044352, 113.02992937,
       128.68514242, 171.55551377, 182.72483817, 127.008611  ,
       192.63588333, 154.29289467,  95.42692049, 168.35000286,
       101.22705089, 111.03725683, 110.5901968 , 185.42039232,
       144.03267223, 178.25385364, 157.65533049, 142.71266293,
       123.6252744 , 136.0834919 , 157.04318249, 164.20554021,
       181.80931254, 125.869104  ,  65.63487663, 158.02223726,
        91.04841987,  41.05017344, 175.60718802, 273.45938051,
        82.37393654, 188.86067814, 154.37552451, 173.63709343,
       106.49434825, 110.5845771 ,  87.71306659, 150.19152982,
       238.95739708, 152.91382848, 210.96731605, 154.80451484,
       156.14301742, 157.31710985, 170.80328144, 122.48376855,
       187.7631208 , 148.40453789,  80.31133945,  97.093196  ,
       149.19437508, 140.4912321 , 278.1623903 , 131.15185917])

In [53]: s.min(), s.max(), s.mean()                                                           
Out[53]: (41.050173444195025, 278.1623902968886, 146.1319527357261)
array([ 74.56817534,  83.87354105,  36.22033645, 144.99633492,
       138.06490465,  86.93306987, 116.08259764, 103.59602264,
        60.56684714, 123.46554835, 101.31969138,  77.34785395,
        88.06092029, 117.39767419, 125.04098847,  86.91364799,
       131.82324586, 105.58463894,  65.30188552, 115.2041013 ,
        69.27099036,  75.98424215,  75.67831315, 126.88559131,
        98.56343498, 121.98143548, 107.8855976 ,  97.66013542,
        84.59838665,  93.12370728, 107.46669674, 112.36799149,
       124.41448235,  86.13386849,  44.91480159, 108.13667668,
        62.30562048,  28.09116875, 120.17028769, 187.13181846,
        56.36955847, 129.23982374, 105.64118362, 118.82212629,
        72.8754706 ,  75.67446752,  60.02319476, 102.77802152,
       163.52166149, 104.64092597, 144.3676842 , 105.93474729,
       106.85070205, 107.65414881, 116.88291181,  83.81723932,
       128.48875095, 101.55515964,  54.9580964 ,  66.44213958,
       102.09565552,  96.13998135, 190.35014936,  89.74892672])

In [59]: r.min(), r.max(), r.mean()                                                           
Out[59]: (28.091168752416973, 190.3501493611971, 100.0)

您可以使用直接乘法来实现:

import numpy as np

# Make 64 noise samples with mean=142, sigma=50
s = np.random.normal(142, 50, 64) 

看起来是这样的:

array([108.96793075, 122.56604336,  52.92948494, 211.88597561,
       201.75694121, 127.03699257, 169.63376672, 151.38689085,
        88.50751644, 180.42261676, 148.06044352, 113.02992937,
       128.68514242, 171.55551377, 182.72483817, 127.008611  ,
       192.63588333, 154.29289467,  95.42692049, 168.35000286,
       101.22705089, 111.03725683, 110.5901968 , 185.42039232,
       144.03267223, 178.25385364, 157.65533049, 142.71266293,
       123.6252744 , 136.0834919 , 157.04318249, 164.20554021,
       181.80931254, 125.869104  ,  65.63487663, 158.02223726,
        91.04841987,  41.05017344, 175.60718802, 273.45938051,
        82.37393654, 188.86067814, 154.37552451, 173.63709343,
       106.49434825, 110.5845771 ,  87.71306659, 150.19152982,
       238.95739708, 152.91382848, 210.96731605, 154.80451484,
       156.14301742, 157.31710985, 170.80328144, 122.48376855,
       187.7631208 , 148.40453789,  80.31133945,  97.093196  ,
       149.19437508, 140.4912321 , 278.1623903 , 131.15185917])

In [53]: s.min(), s.max(), s.mean()                                                           
Out[53]: (41.050173444195025, 278.1623902968886, 146.1319527357261)
array([ 74.56817534,  83.87354105,  36.22033645, 144.99633492,
       138.06490465,  86.93306987, 116.08259764, 103.59602264,
        60.56684714, 123.46554835, 101.31969138,  77.34785395,
        88.06092029, 117.39767419, 125.04098847,  86.91364799,
       131.82324586, 105.58463894,  65.30188552, 115.2041013 ,
        69.27099036,  75.98424215,  75.67831315, 126.88559131,
        98.56343498, 121.98143548, 107.8855976 ,  97.66013542,
        84.59838665,  93.12370728, 107.46669674, 112.36799149,
       124.41448235,  86.13386849,  44.91480159, 108.13667668,
        62.30562048,  28.09116875, 120.17028769, 187.13181846,
        56.36955847, 129.23982374, 105.64118362, 118.82212629,
        72.8754706 ,  75.67446752,  60.02319476, 102.77802152,
       163.52166149, 104.64092597, 144.3676842 , 105.93474729,
       106.85070205, 107.65414881, 116.88291181,  83.81723932,
       128.48875095, 101.55515964,  54.9580964 ,  66.44213958,
       102.09565552,  96.13998135, 190.35014936,  89.74892672])

In [59]: r.min(), r.max(), r.mean()                                                           
Out[59]: (28.091168752416973, 190.3501493611971, 100.0)

现在将平均值转换为100:

r = s * 100./s.mean()

现在看起来是这样的:

array([108.96793075, 122.56604336,  52.92948494, 211.88597561,
       201.75694121, 127.03699257, 169.63376672, 151.38689085,
        88.50751644, 180.42261676, 148.06044352, 113.02992937,
       128.68514242, 171.55551377, 182.72483817, 127.008611  ,
       192.63588333, 154.29289467,  95.42692049, 168.35000286,
       101.22705089, 111.03725683, 110.5901968 , 185.42039232,
       144.03267223, 178.25385364, 157.65533049, 142.71266293,
       123.6252744 , 136.0834919 , 157.04318249, 164.20554021,
       181.80931254, 125.869104  ,  65.63487663, 158.02223726,
        91.04841987,  41.05017344, 175.60718802, 273.45938051,
        82.37393654, 188.86067814, 154.37552451, 173.63709343,
       106.49434825, 110.5845771 ,  87.71306659, 150.19152982,
       238.95739708, 152.91382848, 210.96731605, 154.80451484,
       156.14301742, 157.31710985, 170.80328144, 122.48376855,
       187.7631208 , 148.40453789,  80.31133945,  97.093196  ,
       149.19437508, 140.4912321 , 278.1623903 , 131.15185917])

In [53]: s.min(), s.max(), s.mean()                                                           
Out[53]: (41.050173444195025, 278.1623902968886, 146.1319527357261)
array([ 74.56817534,  83.87354105,  36.22033645, 144.99633492,
       138.06490465,  86.93306987, 116.08259764, 103.59602264,
        60.56684714, 123.46554835, 101.31969138,  77.34785395,
        88.06092029, 117.39767419, 125.04098847,  86.91364799,
       131.82324586, 105.58463894,  65.30188552, 115.2041013 ,
        69.27099036,  75.98424215,  75.67831315, 126.88559131,
        98.56343498, 121.98143548, 107.8855976 ,  97.66013542,
        84.59838665,  93.12370728, 107.46669674, 112.36799149,
       124.41448235,  86.13386849,  44.91480159, 108.13667668,
        62.30562048,  28.09116875, 120.17028769, 187.13181846,
        56.36955847, 129.23982374, 105.64118362, 118.82212629,
        72.8754706 ,  75.67446752,  60.02319476, 102.77802152,
       163.52166149, 104.64092597, 144.3676842 , 105.93474729,
       106.85070205, 107.65414881, 116.88291181,  83.81723932,
       128.48875095, 101.55515964,  54.9580964 ,  66.44213958,
       102.09565552,  96.13998135, 190.35014936,  89.74892672])

In [59]: r.min(), r.max(), r.mean()                                                           
Out[59]: (28.091168752416973, 190.3501493611971, 100.0)