代码之家  ›  专栏  ›  技术社区  ›  Denis Steinman

如何在暗室中制作高ISO效果?

  •  0
  • Denis Steinman  · 技术社区  · 3 年前

    当我们在光线不好的房间里使用移动或半专业相机时,它们通常会增加ISO,结果如下所示:

    Screenshot

    这是视频中的一帧,正如你所看到的,有很多噪音。也许这有点奇怪,但我需要在高质量的视频上产生类似的噪音。然而,一个简单的噪声发生器会产生这样的结果:

    Sample

    有人知道如何获得第一帧的结果吗?或者可能有一些现有的噪声发生器/算法来实现它?如有任何帮助,我将不胜感激。

    0 回复  |  直到 3 年前
        1
  •  2
  •   Spektre    3 年前

    我想你只是简单地将小的随机RGB添加到你的图像中。。。

    我会保持颜色不变,并尝试通过小的随机量来降低颜色强度,使图像变暗,并产生类似形式的噪声。只需将RGB颜色与小于1的随机数相乘。。。

    为了提高结果的可视性,随机值应具有高斯分布或类似分布。这里是小型C++/VCL示例:

    //$$---- Form CPP ----
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <math.h>
    #pragma hdrstop
    #include "win_main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TMain *Main;
    Graphics::TBitmap *bmp0,*bmp1;
    //---------------------------------------------------------------------------
    __fastcall TMain::TMain(TComponent* Owner) : TForm(Owner)
        {
        // init bmps and load from file
        bmp0=new Graphics::TBitmap;
        bmp1=new Graphics::TBitmap;
        bmp0->LoadFromFile("in.bmp");
        bmp0->HandleType=bmDIB;
        bmp0->PixelFormat=pf32bit;
        bmp1->Assign(bmp0);
        ClientWidth=bmp0->Width;
        ClientHeight=bmp0->Height;
        Randomize();
        }
    //---------------------------------------------------------------------------
    void __fastcall TMain::FormDestroy(TObject *Sender)
        {
        // free bmps before exit
        delete bmp0;
        delete bmp1;
        }
    //---------------------------------------------------------------------------
    void __fastcall TMain::tim_updateTimer(TObject *Sender)
        {
        // skip if App not yet initialized
        if (bmp0==NULL) return;
        if (bmp1==NULL) return;
        int x,y,i,a;
        union _color
            {
            BYTE db[4];
            DWORD dd;
            };
        // copy bmp0 into bmp1 with light reduction and noise
        for (y=0;y<bmp0->Height;y++)
            {
            _color *p0=(_color*)bmp0->ScanLine[y];
            _color *p1=(_color*)bmp1->ScanLine[y];
            for (x=0;x<bmp0->Width;x++)
                {
                p1[x]=p0[x];
                for (a=40,i=0;i<10;i++) a+=Random(10);                      // "gauss" PRNG in range 40 .. 140
                for (i=0;i<3;i++) p1[x].db[i]=(DWORD(p1[x].db[i])*a)>>8;    // multiply RGB by a/256
                }
            }
        // render frame on App canvas
        Canvas->Draw(0,0,bmp1);
    //  bmp1->SaveToFile("out.bmp");
        }
    //---------------------------------------------------------------------------
    

    输入图像:

    in

    输出图像:

    output

    可以使用PRNG特性来调整明暗度。

        2
  •  2
  •   Cris Luengo    3 年前

    你在那帧中看到的不是原始的传感器噪声,也不是公认的答案所暗示的胶片颗粒的模拟。相反,它是应用于高ISO图像的降噪滤波器的结果。如果没有滤波器,你会看到很多噪声,主要是泊松噪声。

    我不知道相机内置了什么降噪滤波器,但它很可能在转换为RGB之前应用于原始图像。 Here are many papers describing such filters .

        3
  •  1
  •   Dan Butmalai The Kaese    3 年前

    你基本上需要增加“颗粒”大小,也许可以消除你的噪声点。

    很难获得看起来自然的结果,因为视频中的那些颗粒点是通过对从相机传感器获得的值(具有传感器产生的特定噪声)进行各种类型的插值获得的。
    以“模拟”胶片相机为例(从胶片本身使用的矿物的有效粒度/形状来看,用胶片拍摄的照片具有颗粒状的自然外观)。如果在数字图像上制作一个看起来很自然的类似电影的滤镜如此容易,电影业就不会看到现在的复苏。

    话虽如此,但我脑海中有三件事可能会奏效:

    中值模糊(图像+一些噪声):
    https://docs.opencv.org/master/d4/d13/tutorial_py_filtering.html enter image description here

    使用Perlin噪波生成的图像,根据您的特定帧大小进行缩放+添加图像的颜色*某些因素:
    https://github.com/ruslangrimov/perlin-noise-python-numpy
    enter image description here *因子+你的图像=结果


    用相机拍摄一个非常黑暗的房间,设置相机以产生相同的帧分辨率,并使用高iso,将获得的视频帧添加到视频上(需要应用一些图像处理)。
    希望这些都能对你的项目有所帮助,并祝你好运。