C#で画像の明るさを自動補正するCLIツール

コンピュータ

Real-ESRGANで超解像処理を行うと、処理後の画像が全体的に少し暗くなる傾向があります。

そのため、後からペイントソフトなどで明るさを調整することがありますが、
画像の枚数が多い場合は手作業では少々面倒です。

そこで今回は、基準となる画像の明るさに合わせて自動で補正を行うCLIアプリを
C#で作成してみたいと思います。

ソースコード

Program.cs

// 画像の明るさを自動補正するCLIツール

using OpenCvSharp;

if (args.Length < 3)
{
    Console.WriteLine("BrightnessMatch reference input output");
    return;
}

string refPath = args[0];
string srcPath = args[1];
string outPath = args[2];

var refImg = Cv2.ImRead(refPath);
var srcImg = Cv2.ImRead(srcPath);

if (refImg.Empty() || srcImg.Empty())
{
    Console.WriteLine("image load error");
    return;
}

// グレースケール化
var refGray = refImg.Channels() == 1 ? refImg.Clone() : refImg.CvtColor(ColorConversionCodes.BGR2GRAY);
var srcGray = srcImg.Channels() == 1 ? srcImg.Clone() : srcImg.CvtColor(ColorConversionCodes.BGR2GRAY);

// 平均輝度
double refAvg = Cv2.Mean(refGray).Val0;
double srcAvg = Cv2.Mean(srcGray).Val0;

double gain = refAvg / srcAvg;

Console.WriteLine($"ref avg = {refAvg:F2}");
Console.WriteLine($"src avg = {srcAvg:F2}");
Console.WriteLine($"gain    = {gain:F4}");

// 線形ゲイン補正
var dst = new Mat();
srcImg.ConvertTo(dst, srcImg.Type(), gain, 0);

// 保存
Cv2.ImWrite(outPath, dst);

Console.WriteLine("done");

/*

// プロジェクトの作成
dotnet new console
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.win

// ビルド&インストール
dotnet pack -c Release
dotnet tool install --global BrightnessMatch --add-source .\bin\Release

// 使い方
BrightnessMatch.exe reference.png input.png output.png

*/

BrightnessMatch.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <!-- 追加 ここから -->
    <PackAsTool>true</PackAsTool> 
    <ToolCommandName>BrightnessMatch</ToolCommandName>
    <IsPackable>true</IsPackable>
    <PackageId>BrightnessMatch</PackageId>
    <Version>1.0.0</Version>
    <!-- 追加 ここまで -->
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="OpenCvSharp4" Version="4.13.0.20260308" />
    <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.13.0.20260302" />
  </ItemGroup>

</Project>

コメント