【问题标题】:How to make a high ISO effect in a dark room?如何在暗室中制作高 ISO 效果?
【发布时间】:2021-09-03 13:53:46
【问题描述】:

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

这是视频中的一帧,您可以看到有很多噪点。也许这有点奇怪,但我需要在高质量视频上产生类似的噪音。然而,一个简单的噪声发生器会产生类似的东西:

有没有人知道如何在第一帧上获得结果?或者,也许有一些现有的噪声发生器/算法来制作它?如有任何帮助,我将不胜感激。

【问题讨论】:

  • 我假设您只是在图像中添加了小的随机 RGB... 我会保持颜色不变并尝试从颜色强度中减去一个小的随机... 0.91.0 ...但是这只是我的猜测...如果您还想使图像变暗,只需使用不同的乘法范围,例如 0.5 .. 0.75 ...

标签: algorithm image-processing video-processing noise-generator


【解决方案1】:

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

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

【讨论】:

  • 所以它的 Poisson 而不是 Gauss +1 ...我选择 Gauss with trial & error 只是因为它在视觉上看起来像 CCD 噪声,即使与正态分布相比也是动画)
【解决方案2】:

您基本上需要增加“颗粒”大小,并且可能会平整您的噪点。

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

话虽如此,我想到了三件事可以奏效:

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

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


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

【讨论】:

  • 我可以得到所有相机都不同,噪点是基于物理原理的,但至少在第一张照片上看起来像噪点,我需要那个。非常感谢您的详细解释和解决方案!
  • @Шах не за что)
  • Было неожиданно))
  • “如果能够如此轻松地在数字图像上制作出类似胶片的自然滤镜,那么电影业就不会看到现在发生的卷土重来。”其实一点都不难。如果这就是电影制作人想要使用实际胶卷的原因,那么这种时尚类似于黑胶唱片的卷土重来——愚蠢。
  • @CrisLuengo 很难让数码照片看起来像模拟照片。电影图像有一些颗粒状的绿色黄色调。就仅在数字图像上应用一些滤镜而言,是的,可以得到足够接近的外观,但与胶片图像不完全相同。
【解决方案3】:

我假设您只是在图像中添加了小的随机 RGB...

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

为了提高视觉效果,随机值应采用高斯分布或类似分布。这里是小 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");
    }
//---------------------------------------------------------------------------

输入图片:

输出图像:

您可以使用 PRNG 属性来调整光线和噪音。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多