Mat lena = Cv2.ImRead("lena.jpg");
// 建表
Mat lut = new Mat(1, 256, MatType.CV_8UC1);
for (int i = 0; i < 256; i++)
{
float x = i / 256.0f;
//lut.Set<byte>(i, (byte)Math.Round(256 * (1 / (1 + Math.Pow(Math.E, -(x - 0.5f) / 0.1f)))));// 該方法會(huì)抽風(fēng),不知道為什么
lut.Set<byte>(0, i, (byte)Math.Round(256 * (1 / (1 + Math.Pow(Math.E, -(x - 0.5f) / 0.1f)))));
}
Mat[] bgrs = Cv2.Split(lena);
Cv2.LUT(bgrs[2], lut, bgrs[2]);// 查表調(diào)整
Mat result = new Mat();
Cv2.Merge(bgrs, result);// 重新合成
// 新建一個(gè)圖用于疊加
Mat halo = new Mat(lena.Cols, lena.Rows, MatType.CV_32FC3, new Scalar(.3f, .3f, .3f));
Cv2.Circle(halo, new Point(lena.Cols / 2, lena.Rows / 2), lena.Cols / 3, new Scalar(1, 1, 1), -1);
Cv2.Blur(halo, halo, new Size(lena.Cols / 3, lena.Rows / 3));// 模糊平滑
// 轉(zhuǎn)換成float3類型,便于后續(xù)疊加的乘法
Mat resultf = new Mat();
result.ConvertTo(resultf, MatType.CV_32FC3);
// 開始疊加,乘法
Cv2.Multiply(resultf, halo, resultf);
// 重新轉(zhuǎn)回BGR U3
resultf.ConvertTo(result, MatType.CV_8UC3);
Cv2.ImShow("origin", lena);
Cv2.ImShow("lomography", result);
Cv2.WaitKey();

Lesson5-1.jpg