ソースコード
Program.cs
using OpenCvSharp;
class Program
{
static void Main(string[] args)
{
if (args.Length < 2)
{
Console.WriteLine("usage: NonLocalMean <input> <output> [h]");
return;
}
string input = args[0];
string output = args[1];
using var src = Cv2.ImRead(input, ImreadModes.Unchanged);
if (src.Empty())
{
Console.WriteLine("load failed");
return;
}
// h 自動 or 手動
float h = args.Length >= 3
? float.Parse(args[2])
: CalcAutoH(src.Width, src.Height);
Console.WriteLine($"h = {h:F2}");
using var dst = new Mat();
if (src.Channels() == 1)
{
Cv2.FastNlMeansDenoising(src, dst, h, 7, 21);
}
else
{
Cv2.FastNlMeansDenoisingColored(src, dst, h, h, 7, 21);
}
Cv2.ImWrite(output, dst);
}
// ------------------------
// 自動 h 計算
// ------------------------
static float CalcAutoH(int width, int height)
{
int maxDim = Math.Max(width, height);
// 1000px基準でスケーリング
float scale = maxDim / 1000f;
return 10f * MathF.Sqrt(scale);
}
}
/*
// プロジェクトの作成
dotnet new console
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.win
// ビルド&インストール
dotnet pack -c Release
dotnet tool install --global NonLocalMean --add-source .\bin\Release
// 使い方
NonLocalMean.exe input.png output.png 20
*/
NonLocalMean.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- 追加 ここから -->
<PackAsTool>true</PackAsTool>
<ToolCommandName>NonLocalMean</ToolCommandName>
<IsPackable>true</IsPackable>
<PackageId>NonLocalMean</PackageId>
<Version>1.0.0</Version>
<!-- 追加 ここまで -->
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OpenCvSharp4" Version="4.13.0.20260318" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.13.0.20260302" />
</ItemGroup>
</Project>

コメント