質問編集履歴
9
質問の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,14 +6,10 @@
|
|
6
6
|
|
7
7
|
ただし、色数は255ではなく**254**です。
|
8
8
|
|
9
|
-
サイトではメディアン・カット(中央値分割)と書かれているものです。
|
10
|
-
|
11
9
|
|
12
10
|
|
13
11
|
現状はとにかく減色させて8bitにと思って、OpenCvSharp3のCv2.Kmeansによる減色を試みたのですが、減色はできても8bitにはできずにてこずっております。
|
14
12
|
|
15
|
-
さらに、どこのサイトだったかは分からなくなったのですが、Kmeansは処理負荷が高いので、その前に一度メディアン・カットを行ってからのほうがいいとあったので、それもメディアンカットで実施したい理由です。
|
16
|
-
|
17
13
|
|
18
14
|
|
19
15
|
環境:WindowsForms
|
@@ -206,7 +202,7 @@
|
|
206
202
|
|
207
203
|
要件:
|
208
204
|
|
209
|
-
・メディアンカットでの減色を行いたい(記載しているのはKmeans)
|
205
|
+
・~~メディアンカットでの減色を行いたい(記載しているのはKmeans)~~
|
210
206
|
|
211
207
|
・24bit→8bit(254色)に変換したい
|
212
208
|
|
@@ -365,3 +361,13 @@
|
|
365
361
|
}
|
366
362
|
|
367
363
|
```
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
追記:
|
370
|
+
|
371
|
+
メディアンカットは本要件と違ったため、その部分を削除しました。
|
372
|
+
|
373
|
+
また追記部分には取り消し線で対応しました。
|
8
サンプル修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -250,6 +250,10 @@
|
|
250
250
|
|
251
251
|
{
|
252
252
|
|
253
|
+
int pixelSize = 4;
|
254
|
+
|
255
|
+
int color = 255;
|
256
|
+
|
253
257
|
|
254
258
|
|
255
259
|
//入力されたBitmapをロック
|
@@ -290,6 +294,12 @@
|
|
290
294
|
|
291
295
|
|
292
296
|
|
297
|
+
// カラーパレットを設定
|
298
|
+
|
299
|
+
ColorPalette pal = bmp8bit.Palette;
|
300
|
+
|
301
|
+
|
302
|
+
|
293
303
|
for (int y = 0; y < bmpData.Height; y++)
|
294
304
|
|
295
305
|
{
|
@@ -298,7 +308,9 @@
|
|
298
308
|
|
299
309
|
{
|
300
310
|
|
301
|
-
/
|
311
|
+
/*① この辺りが?です */
|
312
|
+
|
313
|
+
|
302
314
|
|
303
315
|
//(x,y)のデータ位置
|
304
316
|
|
@@ -318,7 +330,15 @@
|
|
318
330
|
|
319
331
|
// 色
|
320
332
|
|
333
|
+
for (int i = 0; i < color; ++i)
|
334
|
+
|
335
|
+
{
|
336
|
+
|
321
|
-
|
337
|
+
pal.Entries[i] = Color.FromArgb(255, r, g, b);
|
338
|
+
|
339
|
+
}
|
340
|
+
|
341
|
+
bmpSource.Palette = pal;
|
322
342
|
|
323
343
|
}
|
324
344
|
|
@@ -326,6 +346,14 @@
|
|
326
346
|
|
327
347
|
|
328
348
|
|
349
|
+
|
350
|
+
|
351
|
+
// 変更を反映
|
352
|
+
|
353
|
+
Marshal.Copy(pixels, 0, pointer, pixels.Length);
|
354
|
+
|
355
|
+
|
356
|
+
|
329
357
|
//ロックを解除する
|
330
358
|
|
331
359
|
bmpSource.UnlockBits(bmpData);
|
7
微々たる誤記の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -216,6 +216,8 @@
|
|
216
216
|
|
217
217
|
現状:
|
218
218
|
|
219
|
+
メディアンカットでは進展なし。
|
220
|
+
|
219
221
|
24bit→8bit変換でサンプルを作成中。
|
220
222
|
|
221
223
|
|
6
サンプル修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -298,29 +298,25 @@
|
|
298
298
|
|
299
299
|
//①この辺りが今?です
|
300
300
|
|
301
|
+
//(x,y)のデータ位置
|
302
|
+
|
303
|
+
int pos = y * bmpData.Height + x * pixelSize;
|
304
|
+
|
305
|
+
|
306
|
+
|
307
|
+
// RGB
|
308
|
+
|
309
|
+
byte b = pixels[pos];
|
310
|
+
|
301
|
-
|
311
|
+
byte g = pixels[pos + 1];
|
302
|
-
|
312
|
+
|
303
|
-
|
313
|
+
byte r = pixels[pos + 2];
|
304
|
-
|
314
|
+
|
315
|
+
|
316
|
+
|
305
|
-
|
317
|
+
// 色
|
306
|
-
|
307
|
-
|
318
|
+
|
308
|
-
|
309
|
-
else if(pixels[y * x] <= 170)
|
310
|
-
|
311
|
-
{
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
}
|
316
|
-
|
317
|
-
|
319
|
+
Color col = Color.FromArgb(255, r, g, b);
|
318
|
-
|
319
|
-
{
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
}
|
324
320
|
|
325
321
|
}
|
326
322
|
|
5
誤記修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -298,7 +298,7 @@
|
|
298
298
|
|
299
299
|
//①この辺りが今?です
|
300
300
|
|
301
|
-
if(pixels[x] <= 85)
|
301
|
+
if(pixels[y * x] <= 85)
|
302
302
|
|
303
303
|
{
|
304
304
|
|
@@ -306,7 +306,7 @@
|
|
306
306
|
|
307
307
|
}
|
308
308
|
|
309
|
-
else if(pixels[x] <= 170)
|
309
|
+
else if(pixels[y * x] <= 170)
|
310
310
|
|
311
311
|
{
|
312
312
|
|
@@ -314,7 +314,7 @@
|
|
314
314
|
|
315
315
|
}
|
316
316
|
|
317
|
-
else if (pixels[x] <= 255)
|
317
|
+
else if (pixels[y * x] <= 255)
|
318
318
|
|
319
319
|
{
|
320
320
|
|
4
サンプル(未完成)のコードを掲載
test
CHANGED
File without changes
|
test
CHANGED
@@ -202,7 +202,7 @@
|
|
202
202
|
|
203
203
|
|
204
204
|
|
205
|
-
追記>
|
205
|
+
追記1>
|
206
206
|
|
207
207
|
要件:
|
208
208
|
|
@@ -217,3 +217,125 @@
|
|
217
217
|
現状:
|
218
218
|
|
219
219
|
24bit→8bit変換でサンプルを作成中。
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
追記2>
|
224
|
+
|
225
|
+
サンプルとして、以下のところまで作成。
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
>NotionalKettleさん
|
230
|
+
|
231
|
+
>つまり減色された画像データに含まれるRGBの組とそれに対応する値(8bit用)を定義して対応が付けられるように8bit側の各画素を上記の方法>で書き換えて、最後にパレットを対応させれば・・・
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
この部分でどうすればいいのかイメージがつかずに詰まってます。
|
236
|
+
|
237
|
+
下記コードではコメント①あたりです。
|
238
|
+
|
239
|
+
尚、byte*での方法については理解が追い付いていないので、とりあえずMarshal.Copyで試してます。
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
```C#
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
unsafe static Bitmap ImageConvert24biTo8bit(Bitmap bmpSource)
|
248
|
+
|
249
|
+
{
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
//入力されたBitmapをロック
|
254
|
+
|
255
|
+
BitmapData bmpData = bmpSource.LockBits(
|
256
|
+
|
257
|
+
new Rectangle(0, 0, bmpSource.Width, bmpSource.Height),
|
258
|
+
|
259
|
+
ImageLockMode.WriteOnly,
|
260
|
+
|
261
|
+
bmpSource.PixelFormat
|
262
|
+
|
263
|
+
);
|
264
|
+
|
265
|
+
|
266
|
+
|
267
|
+
//Bitmapの各画素情報のbyte配列データの先頭ポインタ
|
268
|
+
|
269
|
+
IntPtr pointer = bmpData.Scan0;
|
270
|
+
|
271
|
+
//byte* pImg = (byte*)bmpData.Scan0.ToPointer();
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
byte[] pixels = new byte[bmpData.Stride * bmpSource.Height];
|
276
|
+
|
277
|
+
|
278
|
+
|
279
|
+
// Bitmap を byte [ ] へコピー
|
280
|
+
|
281
|
+
Marshal.Copy(pointer, pixels, 0, pixels.Length);
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
// Bitmapオブジェクトを作成
|
286
|
+
|
287
|
+
Bitmap bmp8bit = new Bitmap(bmpSource.Width, bmpSource.Height, PixelFormat.Format8bppIndexed);
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
for (int y = 0; y < bmpData.Height; y++)
|
292
|
+
|
293
|
+
{
|
294
|
+
|
295
|
+
for (int x = 0; x < bmpData.Width; x++)
|
296
|
+
|
297
|
+
{
|
298
|
+
|
299
|
+
//①この辺りが今?です
|
300
|
+
|
301
|
+
if(pixels[x] <= 85)
|
302
|
+
|
303
|
+
{
|
304
|
+
|
305
|
+
//
|
306
|
+
|
307
|
+
}
|
308
|
+
|
309
|
+
else if(pixels[x] <= 170)
|
310
|
+
|
311
|
+
{
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
}
|
316
|
+
|
317
|
+
else if (pixels[x] <= 255)
|
318
|
+
|
319
|
+
{
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
}
|
324
|
+
|
325
|
+
}
|
326
|
+
|
327
|
+
}
|
328
|
+
|
329
|
+
|
330
|
+
|
331
|
+
//ロックを解除する
|
332
|
+
|
333
|
+
bmpSource.UnlockBits(bmpData);
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
return bmpSource;
|
338
|
+
|
339
|
+
}
|
340
|
+
|
341
|
+
```
|
3
誤記修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -206,7 +206,7 @@
|
|
206
206
|
|
207
207
|
要件:
|
208
208
|
|
209
|
-
・メディアンカットでの減色を行いたい
|
209
|
+
・メディアンカットでの減色を行いたい(記載しているのはKmeans)
|
210
210
|
|
211
211
|
・24bit→8bit(254色)に変換したい
|
212
212
|
|
2
要件と現状を追記。その他内容に影響しない微細な誤記を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
24bit の画像を 8bit (25
|
1
|
+
24bit の画像を 8bit (**254** **color**) にする方法についてわからなくて困っております。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -199,3 +199,21 @@
|
|
199
199
|
}
|
200
200
|
|
201
201
|
```
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
追記>
|
206
|
+
|
207
|
+
要件:
|
208
|
+
|
209
|
+
・メディアンカットでの減色を行いたい
|
210
|
+
|
211
|
+
・24bit→8bit(254色)に変換したい
|
212
|
+
|
213
|
+
・上記に関するライブラリ、参考サイト、コードがあれば
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
現状:
|
218
|
+
|
219
|
+
24bit→8bit変換でサンプルを作成中。
|
1
誤記修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
尚、単純に以下の
|
25
|
+
尚、単純に以下のCloneでPixelFormat.Format8bppIndexedを指定した場合、8bitにはできるものの、色数254の前に画質が荒すぎて酷かったので止めました。
|
26
26
|
|
27
27
|
```C#
|
28
28
|
|
@@ -64,11 +64,11 @@
|
|
64
64
|
|
65
65
|
/// </summary>
|
66
66
|
|
67
|
-
/// <param name="input"></param>
|
67
|
+
/// <param name="input">入力画像</param>
|
68
|
-
|
68
|
+
|
69
|
-
/// <param name="result"></param>
|
69
|
+
/// <param name="result">減色結果画像</param>
|
70
|
-
|
70
|
+
|
71
|
-
/// <param name="ClusterCount"></param>
|
71
|
+
/// <param name="ClusterCount">クラスター値</param>
|
72
72
|
|
73
73
|
public static void Kmeans(Mat input, Mat result, int ClusterCount)
|
74
74
|
|