Skip to content

Commit ddadc98

Browse files
author
harunlakodla
committed
update median and averring
1 parent d81a44e commit ddadc98

File tree

10 files changed

+154
-8
lines changed

10 files changed

+154
-8
lines changed

example/filter/guassian_smoothing_example.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'dart:io';
22

33
import 'package:dart_opencv_sdk/src/edge_detector/canny_edge.dart';
4-
import 'package:dart_opencv_sdk/src/smoothing/guassian.dart';
4+
import 'package:dart_opencv_sdk/src/blur/guassian.dart';
55
import 'package:image/image.dart';
66

77
void main(List<String> args) async {

lib/src/blur/averaging.dart

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import 'package:image/image.dart';
2+
import '../core/functions.dart';
3+
import 'blur.dart';
4+
5+
class AveragingFilter implements SmoothFilter {
6+
final CoreFunctions coreFunctions;
7+
final int radius;
8+
final int kernelSize;
9+
10+
AveragingFilter({this.radius = 2})
11+
: kernelSize = radius * 2 + 1,
12+
coreFunctions = CoreFunctions();
13+
14+
@override
15+
Image applyFilter(Image image) {
16+
final filteredImage = Image(width: image.width, height: image.height);
17+
18+
final kernel = generateKernel();
19+
20+
for (var y = 0; y < image.height; y++) {
21+
for (var x = 0; x < image.width; x++) {
22+
final filteredPixel = applyKernel(image, x, y, kernel);
23+
filteredImage.setPixel(x, y,
24+
ColorFloat64.rgb(filteredPixel, filteredPixel, filteredPixel));
25+
}
26+
}
27+
28+
return filteredImage;
29+
}
30+
31+
List<List<int>> generateKernel() {
32+
final kernel = List.generate(kernelSize, (_) => List.filled(kernelSize, 1));
33+
34+
return kernel;
35+
}
36+
37+
int applyKernel(Image image, int x, int y, List<List<int>> kernel) {
38+
num sumR = 0;
39+
num sumG = 0;
40+
num sumB = 0;
41+
42+
for (var i = -radius; i <= radius; i++) {
43+
for (var j = -radius; j <= radius; j++) {
44+
final pixel = coreFunctions.getPixelSafer(image, x + j, y + i);
45+
final weight = kernel[i + radius][j + radius];
46+
final r = pixel.r;
47+
final g = pixel.g;
48+
final b = pixel.b;
49+
50+
sumR += r * weight;
51+
sumG += g * weight;
52+
sumB += b * weight;
53+
}
54+
}
55+
56+
final filteredR = (sumR ~/ (kernelSize * kernelSize)).clamp(0, 255);
57+
final filteredG = (sumG ~/ (kernelSize * kernelSize)).clamp(0, 255);
58+
final filteredB = (sumB ~/ (kernelSize * kernelSize)).clamp(0, 255);
59+
60+
return coreFunctions.getColors(filteredR, filteredG, filteredB);
61+
}
62+
63+
@override
64+
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
65+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:image/image.dart';
22
import 'dart:math';
33

44
import '../core/functions.dart';
5-
import 'smooth.dart';
5+
import 'blur.dart';
66

77
// https://docs.opencv.org/4.x/d4/d13/tutorial_py_filtering.html
88
class GaussianBlurFilter implements SmoothFilter {

lib/src/blur/median.dart

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import 'package:image/image.dart';
2+
import '../core/functions.dart';
3+
import 'blur.dart';
4+
5+
class MedianBlurFilter implements SmoothFilter {
6+
final CoreFunctions coreFunctions;
7+
final int radius;
8+
final int kernelSize;
9+
10+
MedianBlurFilter({this.radius = 2})
11+
: kernelSize = radius * 2 + 1,
12+
coreFunctions = CoreFunctions();
13+
14+
@override
15+
Image applyFilter(Image image) {
16+
final filteredImage = Image(width: image.width, height: image.height);
17+
18+
for (var y = 0; y < image.height; y++) {
19+
for (var x = 0; x < image.width; x++) {
20+
final filteredPixel = applyMedianFilter(image, x, y);
21+
filteredImage.setPixel(x, y,
22+
ColorFloat64.rgb(filteredPixel, filteredPixel, filteredPixel));
23+
}
24+
}
25+
26+
return filteredImage;
27+
}
28+
29+
int applyMedianFilter(Image image, int x, int y) {
30+
final pixelValues = <int>[];
31+
32+
for (var i = -radius; i <= radius; i++) {
33+
for (var j = -radius; j <= radius; j++) {
34+
final pixel = coreFunctions.getPixelSafer(image, x + j, y + i);
35+
final r = pixel.r;
36+
final g = pixel.g;
37+
final b = pixel.b;
38+
39+
final grayValue = (r + g + b) ~/ 3;
40+
pixelValues.add(grayValue);
41+
}
42+
}
43+
44+
pixelValues.sort();
45+
46+
final medianIndex = (pixelValues.length / 2).floor();
47+
final filteredValue = pixelValues[medianIndex];
48+
49+
return filteredValue;
50+
}
51+
52+
@override
53+
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
54+
}

lib/src/edge_detector/canny_edge.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:dart_opencv_sdk/src/filter/grayscale.dart';
22
import 'package:image/image.dart';
33

44
import '../core/functions.dart';
5-
import '../smoothing/guassian.dart';
5+
import '../blur/guassian.dart';
66
import '../filter/filter.dart';
77
import 'dart:math';
88

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'package:dart_opencv_sdk/src/core/functions.dart';
2+
import 'package:image/image.dart';
3+
4+
abstract class GeometricTransform implements Image {
5+
Image applyFilter(Image image);
6+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:dart_opencv_sdk/src/geometric_transform/geometric_transform.dart';
2+
import 'package:image/image.dart';
3+
import 'package:image/src/image/image.dart';
4+
5+
class RotateImage implements GeometricTransform {
6+
final angle;
7+
8+
RotateImage({this.angle});
9+
10+
@override
11+
Image applyFilter(Image image) {
12+
return copyRotate(image, angle: angle);
13+
}
14+
15+
@override
16+
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
17+
}

lib/src/smoothing/averaging.dart

Whitespace-only changes.

test/dart_opencv_sdk_test.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
import 'package:dart_opencv_sdk/dart_opencv_sdk.dart';
22
import 'package:test/test.dart';
33

4+
class ClassName {
5+
ClassName name(params) {
6+
return this;
7+
}
8+
}
9+
410
void main() {
5-
group('A group of tests', () {
6-
final awesome = Awesome();
11+
ClassName().name("aaa").name("Hello").name("aa");
712

13+
group('A group of tests', () {
814
setUp(() {
915
// Additional setup goes here.
1016
});
1117

12-
test('First Test', () {
13-
expect(awesome.isAwesome, isTrue);
14-
});
18+
test('First Test', () {});
1519
});
1620
}

0 commit comments

Comments
 (0)