質問編集履歴

9

質問の修正

2020/03/05 08:26

投稿

tride
tride

スコア68

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

サンプル修正

2020/03/05 08:26

投稿

tride
tride

スコア68

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
- Color col = Color.FromArgb(255, r, g, b);
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

微々たる誤記の修正

2020/01/12 05:41

投稿

tride
tride

スコア68

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

サンプル修正

2020/01/12 05:28

投稿

tride
tride

スコア68

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
- if(pixels[y * x] <= 85)
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
- else if (pixels[y * x] <= 255)
319
+ Color col = Color.FromArgb(255, r, g, b);
318
-
319
- {
320
-
321
-
322
-
323
- }
324
320
 
325
321
  }
326
322
 

5

誤記修正

2020/01/12 05:26

投稿

tride
tride

スコア68

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

サンプル(未完成)のコードを掲載

2020/01/12 03:04

投稿

tride
tride

スコア68

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

誤記修正

2020/01/12 03:02

投稿

tride
tride

スコア68

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

要件と現状を追記。その他内容に影響しない微細な誤記を修正

2020/01/11 23:57

投稿

tride
tride

スコア68

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 24bit の画像を 8bit (256 **color**) にする方法についてわからなくて困っております。
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

誤記修正

2020/01/11 23:25

投稿

tride
tride

スコア68

test CHANGED
File without changes
test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- 尚、単純に以下のように一度Cloneしてした場合、8bitにはできるものの色数254の前に画質が荒すぎて酷かったので止めました。
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