非真实渲染
非真实感渲染(Non Photorealistic Rendering,简称NPR),是指利用计算机模拟各种视觉艺术的绘制风格,也用于发展新的绘制风格。比如模拟中国画、水彩、素描、油画、版画等艺术风格。NPR也可以把三维场景渲染出丰富的、特别的新视觉效果,使它具备创新的功能。NPR渲染以强烈的艺术形式应用在动画、游戏等娱乐领域中,也出现在工程、工业设计图纸中。广阔的应用领域,不仅是由于它的艺术表现形式丰富多样,还在于计算机能够辅助完成原本工作量大、难度高的创作工作。 目前,基于三维软件的NPR渲染器相当多,如FinalToon, Il-lustrator, Pencil等,同时还可以借用程序贴图来创建NPR的材质,协助生成手绘风格的图像效果;另外,像Mental Ray,Reyes,Brazil等外挂渲染器都是NPR渲染的解决方案
引用自【百度百科】
API
OpenCV给我们提供了四种非真实渲染的使用场景:边缘保留滤波、细节增强、素描铅笔画、风格化。
边缘保留滤波
1public static void edgePreservingFilter(Mat src, Mat dst, int flags, float sigma_s, float sigma_r)
- 参数一:src,输入图像,8位三通道。
- 参数二:dst,输出图像,8位三通道。
- 参数三:flags,边缘保留标志位。
1
2
3public static final int RECURS_FILTER = 1, NORMCONV_FILTER = 2;
- 参数四:sigma_s,邻域大小。取值0~200。
- 参数五:sigma_r,邻域内被平均的颜色的不相近程度。取值0~1。
细节增强
1public static void detailEnhance(Mat src, Mat dst, float sigma_s, float sigma_r)
- 参数一:src,输入图像,8位三通道。
- 参数二:dst,输出图像,8位三通道。
- 参数三:sigma_s,邻域大小。取值0~200。
- 参数四:sigma_r,邻域内被平均的颜色的不相近程度。取值0~1。
素描铅笔画
1public static void pencilSketch(Mat src, Mat dst1, Mat dst2, float sigma_s, float sigma_r, float shade_factor)
- 参数一:src,输入图像,8位三通道。
- 参数二:dst1,输出图像,8位单通道,即黑白素描。
- 参数三:dst2,输出图像,大小类型与输入图像相同,即彩色素描。
- 参数四:sigma_s,邻域大小。取值0~200。
- 参数五:sigma_r,邻域内被平均的颜色的不相近程度。取值0~1。
- 参数六:shade_factor,强度缩放值。取值0~0.1
风格化
1public static void stylization(Mat src, Mat dst, float sigma_s, float sigma_r)
- 参数一:src,输入图像,8位三通道。
- 参数二:dst,输出图像,8位三通道。
- 参数三:sigma_s,邻域大小。取值0~200。
- 参数四:sigma_r,邻域内被平均的颜色的不相近程度。取值0~1。
关于sigma_s和sigma_r:
sigma_s,即Sigma_Spatial,决定平滑量。sigma_r,即Sigma_Range,决定平均值。
典型的平滑滤波器将像素值替换为其相邻像素的加权和。 邻域越大,过滤后的图像看起来越平滑。 邻域的大小与参数sigma_s成正比。但是在边缘保留滤波器里,有两个关键点:1)平滑图片;2)不平滑边缘/颜色边界。换句话说,我们就无法简单地将像素值替换成邻域像素的加权和。而是在邻域内选取和当前像素值相近的像素然后求取平均值,然后替换当前像素值的方式来避免上述问题。所以就需要两个参数来明确范围和颜色相似程度。
操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165/** * 非真实渲染 * * @author yidong * @date 11/30/20 */ class NonPhotoRealisticRenderingActivity : AppCompatActivity() { private lateinit var mRgb: Mat private val mBinding: ActivityNonPhotorealisticRenderingBinding by lazy { ActivityNonPhotorealisticRenderingBinding.inflate(layoutInflater) } private var sigmaR = 10f set(value) { field = when { value > 200f -> { 200f } value < 0f -> { 200f } else -> { value } } mBinding.tvSigmaR.text = sigmaR.toInt().toString(10) } private var sigmaS = 0.1f set(value) { field = when { value > 1.0f -> { 1.0f } value < 0f -> { 0f } else -> { value } } mBinding.tvSigmaS.text = String.format("%.1f", sigmaS) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(mBinding.root) mRgb = Mat() val bgr = Utils.loadResource(this, R.drawable.cow) Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB) mBinding.ivLena.showMat(mRgb) } private fun doEdgePreservingFilter(flag: Int) { val dst = Mat() mBinding.isLoading = true GlobalScope.launch(Dispatchers.IO) { Photo.edgePreservingFilter(mRgb, dst, flag, sigmaR, sigmaS) launch(Dispatchers.Main) { mBinding.isLoading = false mBinding.ivResult.showMat(dst) } } } private fun doDetailEnhance() { val dst = Mat() mBinding.isLoading = true GlobalScope.launch(Dispatchers.IO) { Photo.detailEnhance(mRgb, dst, sigmaR, sigmaS) launch(Dispatchers.Main) { mBinding.isLoading = false mBinding.ivResult.showMat(dst) } } } private fun doPencilSketch() { val dst1 = Mat() val dst2 = Mat() mBinding.isLoading = true GlobalScope.launch(Dispatchers.IO) { Photo.pencilSketch(mRgb, dst1, dst2, sigmaR, sigmaS, 0.03f) launch(Dispatchers.Main) { mBinding.isLoading = false mBinding.ivResult.showMat(dst2) } } } private fun doStylization() { val dst = Mat() mBinding.isLoading = true GlobalScope.launch(Dispatchers.IO) { Photo.stylization(mRgb, dst, sigmaR, sigmaS) launch(Dispatchers.Main) { mBinding.isLoading = false mBinding.ivResult.showMat(dst) } } } override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_non_photorealistic_rendering, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { title = item.title when (item.itemId) { R.id.photo_edge_preserving_normconv_filter -> { doEdgePreservingFilter(Photo.NORMCONV_FILTER) } R.id.photo_edge_preserving_recurs_filter -> { doEdgePreservingFilter(Photo.RECURS_FILTER) } R.id.photo_detail_enhance -> { doDetailEnhance() } R.id.photo_pencil_sketch -> { doPencilSketch() } R.id.photo_stylization -> { doStylization() } } return true } fun incSigmaR(view: View) { this.sigmaR = this.sigmaR.plus(1.0f) if (this.sigmaR > 200.0f) { this.sigmaR = 200f } } fun decSigmaR(view: View) { this.sigmaR = this.sigmaR.minus(1.0f) if (this.sigmaR < 0f) { this.sigmaR = 0f } } fun incSigmaS(view: View) { this.sigmaS = this.sigmaS.plus(.1f) if (this.sigmaS > 1.0f) { this.sigmaS = 1f } } fun decSigmaS(view: View) { this.sigmaS = this.sigmaS.minus(.1f) if (this.sigmaS < 0f) { this.sigmaS = 0f } } }
效果
以上就是Android基于OpenCV实现非真实渲染的详细内容,更多关于Android OpenCV实现非真实渲染的资料请关注靠谱客其它相关文章!
最后
以上就是陶醉高山最近收集整理的关于Android基于OpenCV实现非真实渲染的全部内容,更多相关Android基于OpenCV实现非真实渲染内容请搜索靠谱客的其他文章。
发表评论 取消回复