> 文章列表 > 杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)

杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)

杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)

一、前言

2023-03-23我发布了基于加权概率模型(杰林码的理论模型)的图像颜色增强和轮廓预测的应用方法。效果还不太明显,于是我又花了2周的时间进行了技术优化。下面仅提供了x86下的BMP和JPG对应的lib和dll,本文中的算法属于我国自主的发明专利技术,商用必须获得授权,可提供linux(麒麟、鸿蒙)、x64、riscv、ARM等库,可在GPU上实现视频清晰化处理。在相同的尺寸下加权概率模型优化后的效果:
杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)
杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)
杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)
杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)
杰林码图像增强算法——超分辨率、图像放大、轮廓和色彩强化算法(二)
效率方面还不错,一张1080P的图像大概能在1秒左右运算完毕。如果采用多线程完全可以在GPU上实现多帧优化。上面相关参数设置的比较夸张,实际情况下可以根据个人感觉进行设置。

二、测试程序

int main() { // 3ULONGLONG 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 // WIN32int main() { // 4ULONGLONG 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