Libraryless. Click here for Pure Java version (7025L/40K).
1 | sclass Gazelle22_GradientImage { |
2 | // input |
3 | BWImage posterized; |
4 | double gradientThreshold = .25; |
5 | |
6 | // output |
7 | BWImage out; |
8 | |
9 | // internal |
10 | PosterizeBWImage op; |
11 | BWImage unposterized; |
12 | int w, h, brightnessLevels, singleStep; |
13 | |
14 | *(BWImage *posterized) {} |
15 | |
16 | bool init() { |
17 | op = (PosterizeBWImage) getMetaSrc(posterized); |
18 | if (op == null) false; |
19 | unposterized = op.img; |
20 | brightnessLevels = op.brightnessLevels; |
21 | |
22 | assertSameSize(unposterized, posterized); |
23 | w = posterized.getWidth(); |
24 | h = posterized.getHeight(); |
25 | singleStep = iceil(doubleRatio(255, brightnessLevels-1)); |
26 | true; |
27 | } |
28 | |
29 | BWImage get() { |
30 | init(); |
31 | |
32 | out = new BWImage(w*2+1, h*2+1); |
33 | for y to h: |
34 | for x to w: { |
35 | if (x < w-1) checkPair(x, y, x+1, y); |
36 | if (y < h-1) checkPair(x, y, x, y+1); |
37 | } |
38 | |
39 | ret out; |
40 | } |
41 | |
42 | // also returns true for inner pixels |
43 | // may not work 100% yet (see gazelle22_highlightRegionOutline) |
44 | bool isGradientPoint(int x, int y) { |
45 | if (op == null) false; |
46 | |
47 | new IntMinMax posterizedMinMax; |
48 | new IntMinMax unposterizedMinMax; |
49 | |
50 | // need to grab point and all 8 neighbors to cover all cases |
51 | for (int y2 = max(0, y-1); y2 <= min(h-1, y+1); y2++) |
52 | for (int x2 = max(0, x-1); x2 <= min(w-1, x+1); x2++) { |
53 | posterizedMinMax.add(posterized.getInt(x2, y2)); |
54 | unposterizedMinMax.add(unposterized.getInt(x2, y2)); |
55 | } |
56 | |
57 | int posterizedContrast = posterizedMinMax.rangeLength(); |
58 | if (posterizedContrast > singleStep) false; |
59 | if (posterizedContrast == 0) true; |
60 | int unposterizedContrast = unposterizedMinMax.rangeLength(); |
61 | ret unposterizedContrast <= posterizedContrast*gradientThreshold; |
62 | } |
63 | |
64 | void checkPair(int x, int y, int x2, int y2) { |
65 | int posterizedContrast = absDiff(posterized.getInt(x, y), |
66 | posterized.getInt(x2, y2)); |
67 | |
68 | if (posterizedContrast == 0) ret; |
69 | if (posterizedContrast > singleStep) ret; |
70 | |
71 | int realContrast = absDiff(unposterized.getInt(x, y), |
72 | unposterized.getInt(x2, y2)); |
73 | double ratio = doubleRatio(realContrast, singleStep); |
74 | float result = cast (.5-ratio)*2; |
75 | /*if (ratio < .5)*/ { |
76 | out.setPixel(x*2+1-(y2-y), y*2+1, result); |
77 | out.setPixel(x*2+1, y*2+1-(x2-x), result); |
78 | } |
79 | } |
80 | } |
Began life as a copy of #1033934
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, ekrmjmnbrukm, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1033937 |
Snippet name: | Gazelle22_GradientImage [OK, makes an image 4 times the resolution of the input to show boundaries] |
Eternal ID of this version: | #1033937/22 |
Text MD5: | 5aa81b68f27f4c635b3ea7c00ec9314e |
Transpilation MD5: | 4698d07577456c1ebd84aa959f2a29e6 |
Author: | stefan |
Category: | javax / gazelle 22 |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-01-17 18:52:30 |
Source code size: | 2375 bytes / 80 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 178 / 332 |
Version history: | 21 change(s) |
Referenced in: | [show references] |