草庐IT

Opencv学习之:将图片的值进行范围调整 cv2.normalize()

暖仔会飞 2023-11-04 原文

cv2.normalize()

  • 指定将图片的值放缩到 0-255 之间
array = cv2.normalize(array,None,0,255,cv2.NORM_MINMAX)
  • cv2.NORM_MINMAX :使用的放缩方式是 min_max 的方式

  • 其对应的原理是:
    x ^ = x − m i n m a x − m i n ∗ ( m a x ′ − m i n ′ ) + m i n ′ \hat{x} = \frac{x-min}{max-min} * (max^{'}-min^{'}) + min^{'} x^=maxminxmin(maxmin)+min

    • x ^ \hat{x} x^ 表示矩阵中任意一点归一化之后的值
    • x x x 表示矩阵中的所有原始值
    • m i n , m a x min,max min,max 分别代表矩阵中的最大值和最小值
    • m a x ′ , m i n ′ max^{'}, min^{'} max,min 分别表示放缩的目标范围中的最大和最小值
  • 例如当我们想把 0-255 值放缩到 0-1 之间,那么 m a x = 255 , m i n = 0 , m a x ′ = 1 , m i n ′ = 0 max=255, min=0, max^{'}=1,min^{'}=0 max=255,min=0,max=1,min=0 就可以得到我们平时用的归一化公式:
    x ^ = x − m i n m a x − m i n \hat{x} = \frac{x-min}{max-min} x^=maxminxmin

  • 而当我们想把值从 0-1 之间放缩到 0-255 那么 m a x = 1 , m i n = 0 , m a x ′ = 255 , m i n ′ = 0 max=1, min=0, max^{'}=255,min^{'}=0 max=1,min=0,max=255,min=0
    x ^ = x − 0 1 − 0 ∗ ( 255 − 0 ) + 0 = x ∗ 255 \hat{x} = \frac{x-0}{1-0} * (255-0) + 0=x*255 x^=10x0(2550)+0=x255

  • 除此之外,还有其他的归一化和放缩的选项,例如:

    • cv2.NORM_INF:归一化数组的(切比雪夫距离)L∞范数(绝对值的最大值)
    • cv2.NORM_L1 : 归一化数组的(曼哈顿距离)L1-范数(绝对值的和)
    • cv2.NORM_L2: 归一化数组的(欧几里德距离)L2-范数
  • 想知道具体的公式解析可以参考文章:
    opencv中归一化函数cv2.normalize()的原理讲解

代码示例


import cv2 
test_set = torchvision.datasets.CIFAR10(root='../datasets', train=False, download=False, transform=None)
x = train_set.data[0]
x = x / 255.
x

array([[[0.23137255, 0.24313725, 0.24705882],
    [0.16862745, 0.18039216, 0.17647059],
    [0.19607843, 0.18823529, 0.16862745],
    ...,
    [0.61960784, 0.51764706, 0.42352941],
    [0.59607843, 0.49019608, 0.4       ],
    [0.58039216, 0.48627451, 0.40392157]],

   [[0.0627451 , 0.07843137, 0.07843137],
    [0.        , 0.        , 0.        ],
    [0.07058824, 0.03137255, 0.        ],
    ...,
    [0.48235294, 0.34509804, 0.21568627],
    [0.46666667, 0.3254902 , 0.19607843],
    [0.47843137, 0.34117647, 0.22352941]],

   [[0.09803922, 0.09411765, 0.08235294],
    [0.0627451 , 0.02745098, 0.        ],
    [0.19215686, 0.10588235, 0.03137255],
    ...,
    [0.4627451 , 0.32941176, 0.19607843],
    [0.47058824, 0.32941176, 0.19607843],
    [0.42745098, 0.28627451, 0.16470588]],

   ...,

   [[0.81568627, 0.66666667, 0.37647059],
    [0.78823529, 0.6       , 0.13333333],
    [0.77647059, 0.63137255, 0.10196078],
    ...,
    [0.62745098, 0.52156863, 0.2745098 ],
    [0.21960784, 0.12156863, 0.02745098],
    [0.20784314, 0.13333333, 0.07843137]],

   [[0.70588235, 0.54509804, 0.37647059],
    [0.67843137, 0.48235294, 0.16470588],
    [0.72941176, 0.56470588, 0.11764706],
    ...,
    [0.72156863, 0.58039216, 0.36862745],
    [0.38039216, 0.24313725, 0.13333333],
    [0.3254902 , 0.20784314, 0.13333333]],

   [[0.69411765, 0.56470588, 0.45490196],
    [0.65882353, 0.50588235, 0.36862745],
    [0.70196078, 0.55686275, 0.34117647],
    ...,
    [0.84705882, 0.72156863, 0.54901961],
    [0.59215686, 0.4627451 , 0.32941176],
    [0.48235294, 0.36078431, 0.28235294]]])
plt.imshow(x)

x_ = cv2.normalize(x,None,0,255,cv2.NORM_MINMAX)
x_
array([[[ 59,  62,  63],
    [ 43,  46,  45],
    [ 50,  48,  43],
    ...,
    [158, 132, 108],
    [152, 125, 102],
    [148, 124, 103]],

   [[ 16,  20,  20],
    [  0,   0,   0],
    [ 18,   8,   0],
    ...,
    [123,  88,  55],
    [119,  83,  50],
    [122,  87,  57]],

   [[ 25,  24,  21],
    [ 16,   7,   0],
    [ 49,  27,   8],
    ...,
    [118,  84,  50],
    [120,  84,  50],
    [109,  73,  42]],

   ...,

   [[208, 170,  96],
    [201, 153,  34],
    [198, 161,  26],
    ...,
    [160, 133,  70],
    [ 56,  31,   7],
    [ 53,  34,  20]],

   [[180, 139,  96],
    [173, 123,  42],
    [186, 144,  30],
    ...,
    [184, 148,  94],
    [ 97,  62,  34],
    [ 83,  53,  34]],

   [[177, 144, 116],
    [168, 129,  94],
    [179, 142,  87],
    ...,
    [216, 184, 140],
    [151, 118,  84],
    [123,  92,  72]]], dtype=uint8)
plt.imshow(x_)

有关Opencv学习之:将图片的值进行范围调整 cv2.normalize()的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  5. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  6. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  7. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  8. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  9. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

随机推荐