一、前言
2023-03-23我发布了基于加权概率模型(杰林码的理论模型)的图像颜色增强和轮廓预测的应用方法。效果还不太明显,于是我又花了2周的时间进行了技术优化。下面仅提供了x86下的BMP和JPG对应的lib和dll,本文中的算法属于我国自主的发明专利技术,商用必须获得授权,可提供linux(麒麟、鸿蒙)、x64、riscv、ARM等库,可在GPU上实现视频清晰化处理。在相同的尺寸下加权概率模型优化后的效果:
效率方面还不错,一张1080P的图像大概能在1秒左右运算完毕。如果采用多线程完全可以在GPU上实现多帧优化。上面相关参数设置的比较夸张,实际情况下可以根据个人感觉进行设置。
二、测试程序
int main() { // 3
ULONGLONG t1, t2;
WJLImageEnhancement wie;
int err;
char url1[200], url2[200];
int i, length;
ImageEnhanced imageEnhanced;
// 设置对应的参数
imageEnhanced.magnification = 0; // 图像放大尺寸,0为不放大仅做清晰化处理
imageEnhanced.contour_size = 15; // 轮廓像素范围,影响清晰度和运算效率,越大越清晰但运算所需时间越长
imageEnhanced.jielin_ratio = 35; // 杰林码系数0-49共50种值,越接近0则可以分解出背景的子图,越接近50则可以分解出前景子图
imageEnhanced.foreground_clear_size = 7; // 前景清晰化的像素范围
imageEnhanced.background_clear_size = 3; // 背景清晰化的像素范围
imageEnhanced.threshold = 13; // 相邻像素值之差的绝对阈值,当绝对值大于等于threshold时属于需要清晰化的像素值,配合foreground_clear_size和background_clear_size同时使用的
const char* fileName = "xxxx"; // xxxx为BMP图像的名称
sprintf_s(url1, 200, "D:\\%s.bmp", fileName);
sprintf_s(url2, 200, "D:\\%s-%d-%d-%d-%d-%d.bmp", fileName, imageEnhanced.magnification, imageEnhanced.jielin_ratio, imageEnhanced.contour_size, imageEnhanced.foreground_clear_size, imageEnhanced.background_clear_size);
// 把灰度图像进行滤波变换
t1 = GetTickCount64();
err = wie.WJL_BMPFILE_ENHANCEMENT(url1, url2, &imageEnhanced);
t2 = GetTickCount64();
// 耗时,包括了bmp图像读写和运算部分
printf("运算总耗时:%lld ms\n", t2 - t1);
system("pause");
return 0;
}
三、vs2019下引用的方法
新建一个控制台项目,然后右击:
然后新建一个main.cpp
#include "WJLImageEnhancement.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <math.h>
using namespace std;
#ifdef WIN32
#define inline __inline
#endif // WIN32
int main() { // 4
ULONGLONG t1, t2;
WJLImageEnhancement wie;
int err;
char url1[200], url2[200];
ImageEnhanced imageEnhanced;
// 设置对应的参数,根据个人喜好设置
imageEnhanced.magnification = 0; // 图像放大尺寸,0为不放大仅做清晰化处理
imageEnhanced.contour_size = 15; // 轮廓像素范围,影响清晰度和运算效率,越大越清晰但运算所需时间越长
imageEnhanced.jielin_ratio = 35; // 杰林码系数0-49共50种值,越接近0则可以分解出背景的子图,越接近50则可以分解出前景子图
imageEnhanced.foreground_clear_size = 5; // 前景清晰化的像素范围
imageEnhanced.background_clear_size = 2; // 背景清晰化的像素范围
imageEnhanced.threshold = 13; // 相邻像素值之差的绝对阈值,当绝对值大于等于threshold时属于需要清晰化的像素值,配合foreground_clear_size和background_clear_size同时使用的
const char* fileName = "heye"; // jpg的文件名
sprintf_s(url1, 200, "D:\\%s.jpg", fileName);
sprintf_s(url2, 200, "D:\\%s-%d-%d-%d-%d-%d.bmp", fileName, imageEnhanced.magnification, imageEnhanced.jielin_ratio, imageEnhanced.contour_size, imageEnhanced.foreground_clear_size, imageEnhanced.background_clear_size);
// 把灰度图像进行滤波变换
t1 = GetTickCount64();
err = wie.WJL_JPGFILE_ENHANCEMENT(url1, url2, &imageEnhanced);
t2 = GetTickCount64();
// 耗时
printf("变换算法总耗时:%lld ms\n", t2 - t1);
system("pause");
return 0;
}
比如下面的效果图:
控制台运行时间:
然后比较两张图的效果如下:
参数不同将产生不同的效果:
通过测试,各参数的设置取值范围为:
在杰林码超分辨率的算法程序内,主要是ImageEnhanced结构体的参数直接影响到图像输出的质量。
参数名称 | 取值范围 | 功能说明 |
---|---|---|
magnification | 0-3 | 尺寸放大参数,0表示不放大,1代表图像放大(1+1)(1+1)=4倍,2代表图像放大(2+1)(2+1)=9倍,一般情况下1080P放大到4K输入1即可,一般设置为0-2 |
jielin_ratio | 0-49 | 杰林码算法的前景背景像素分离的核心参数,越接近0获得的像素块越接近纹理背景,越接近49获得的像素块越接近前景,通过参数设置把图像分割成为前景像素块和背景像素块,属于频率变换算法的一种,一般设置为15-35 |
contour_size | 4-32 | 这个是以块为单位的轮廓预测参数,一般情况下设置为15,越小效率越高,但是轮廓预测的越不准确,一般设置为15-24 |
foreground_clear_size | 1-16 | 前景像素块内的连续像素个数,此值越大运算越慢,前景和背景的轮廓越清晰,一般设置为1-8 |
background_clear_size | 1-8 | 背景纹理预测的连续像素个数,此值越大运算越慢,纹理越清晰,一般设置为1-3 |