2024/06/01(土) [n年前の日記]
#1 [prog] OpenGLの最大テクスチャサイズを少し調べてみた
手持ちの色々なPC/GPUで、OpenGL の最大テクスチャサイズを ―― GL_MAX_TEXTURE_SIZE の値を調べてみた。GL_MAX_TEXTURE_SIZE の値は、利用できるテクスチャの最大サイズ(横幅と縦幅)を示してる、らしい。
もっとも、今時こんな古いスペックのPCを使ってる人は少ないのではという気もする…。
CPU/GPU | OS | GL_MAX_TEXTURE_SIZE |
---|---|---|
NVIDIA GeForce GTX 1060 6GB | Windows10 x64 22H2 | 32768 |
AMD Athlon 5350 (Radeon R3 (GCN)) | Windows10 x64 22H2 | 16384 |
Intel i3-6100T (Intel HD Graphics 530) | Ubuntu Linux 22.04 LTS | 16384 |
AMD A8-3850 (Radeon HD 6550D) | Ubuntu Linux 20.04 LTS | 16384 |
AMD A6-3500 (Radeon HD 6530D) | Linux Mint 21.1 | 16384 |
Intel i5-2500 (Intel HD Graphics 2000) | Ubuntu Linux 20.04 LTS | 8192 |
Lenovo IdeaPad S10-2 (Intel Atom N270, Mobile Intel 945GSE Express) | Debian Linux 11 bullseye i686 | 2048 |
- Intel i5-2500というかなり古い世代ですら 8192 x 8192 までテクスチャを使えるらしい。ありがたい。
- Intel Atom N270時代のスペックだと 2048x2048 まで。さすがにコレは厳しい。
もっとも、今時こんな古いスペックのPCを使ってる人は少ないのではという気もする…。
◎ 調査に使ったソース :
調査に使ったC言語のソースは以下。GLFW3 を使ってる。
_get_max_texsize.c
Makefile は以下。GNU Make + gcc 用。
_Makefile
以下のバージョンでビルドできることを確認した。
以下でビルド。get_max_texsize.exe か get_max_texsize が生成される。
以下で実行。
実行するとウインドウが開くので、そのまま閉じる。log.txt というテキストファイルに、以下のような結果が出力される。
注意点。Linxu機の場合、実機のデスクトップ上で仮想端末を開いて実行しないと正確な値が得られない。当初面倒臭がって、Windows10 x64 22H2 + MobaXterm からLinux機にsshでアクセスして ./get_max_texsize を実行したら、MobaXtermが持ってるXサーバで実行することになってしまったようで、アクセス先のPCスペックとは違う値を返してきてしまった…。実機上で動かさないとダメ。
_get_max_texsize.c
#include <stdlib.h> #include <stdio.h> #include <GL/gl.h> #include <GLFW/glfw3.h> #define SCRW 512 #define SCRH 288 #define TITLE "Max texture size" int main(void) { if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); exit(EXIT_FAILURE); } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 1); // set OpenGL 1.1 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); GLFWwindow *window = glfwCreateWindow(SCRW, SCRH, TITLE, NULL, NULL); if (!window) { fprintf(stderr, "Failed to open GLFW window\n"); glfwTerminate(); exit(EXIT_FAILURE); } glfwMakeContextCurrent(window); // get max texture size GLint maxTextureSize; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); printf("Max Texture Size (width/height): %d\n", maxTextureSize); // save max texture size to log.txt FILE *fp; fp = fopen("log.txt", "w"); if (fp != NULL) { fprintf(fp, "Max Texture Size (width/height): %d\n", maxTextureSize); fclose(fp); } // main loop while (!glfwWindowShouldClose(window)) { // render glClearColor(0.2, 0.4, 0.8, 0.0); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }
Makefile は以下。GNU Make + gcc 用。
_Makefile
SRCS = get_max_texsize.c ifeq ($(OS),Windows_NT) # Windows TARGET = get_max_texsize.exe GCC_VERSION=$(shell gcc -dumpversion) ifeq ($(GCC_VERSION),6.3.0) # MinGW gcc 6.3.0 LIBS = -static -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3dll -mwindows else # MinGW gcc 9.2.0, MSYS2 LIBS = -static -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3 -mwindows endif else # Linux (Ubuntu Linux 22.04 LTS, gcc 11.4.0) TARGET = get_max_texsize LIBS = -lGL -lGLU -lglfw -lm endif all: $(TARGET) $(TARGET): $(SRCS) Makefile gcc $< -o $@ $(LIBS) .PHONY: clean clean: rm -f $(TARGET) *.o
以下のバージョンでビルドできることを確認した。
- MinGW gcc 6.3.0 + GNU Make 3.81
- MSYS2 gcc 14.1.0 + GNU Make 4.4.1
- Linux gcc 9.4.0 + GNU Make 4.2.1
以下でビルド。get_max_texsize.exe か get_max_texsize が生成される。
make clean make
以下で実行。
# Windows get_max_texsize.exe # Linux ./get_max_texsize
実行するとウインドウが開くので、そのまま閉じる。log.txt というテキストファイルに、以下のような結果が出力される。
Max Texture Size (width/height): 32768
注意点。Linxu機の場合、実機のデスクトップ上で仮想端末を開いて実行しないと正確な値が得られない。当初面倒臭がって、Windows10 x64 22H2 + MobaXterm からLinux機にsshでアクセスして ./get_max_texsize を実行したら、MobaXtermが持ってるXサーバで実行することになってしまったようで、アクセス先のPCスペックとは違う値を返してきてしまった…。実機上で動かさないとダメ。
[ ツッコむ ]
2024/06/02(日) [n年前の日記]
#1 [cg_tools] 画像の透明部分の境界の色を調整したくて試行錯誤中
png画像の透明部分と不透明部分の境界の色を調整する方法がないか、GIMP 2.10.34 Portable を使って試行錯誤中。
OpenGLでテクスチャを描画した際、アルファチャンネルの値が255(不透明)のところと、0(完全に透明)のところの境界で、妙な線が入ってしまう。OpenGLのテクスチャのフィルタ設定で、GL_NEAREST を指定した時はそういう状態にならないのだけど、GL_LINEAR を指定した時はそういう状態になる。
おそらくだけど、不透明部分のRGB値と、透明部分のRGB値を持ってきて、補間して描画色を決めてるから、妙な線が入るのだろうと思っているけれど…。おそらく透明部分のRGB値は(0.0, 0.0, 0.0) になっているのではないか…。だからうっすらと黒い線(灰色の線)が描画されてしまうのではないかと…。
だとしたら、テクスチャ画像のアルファチャンネルが0のところにも、何かしらのRGB値を入れてやれば改善しそう。ただ、どんなツールを使って作業すればそんなことができるのかが分からない…。
GIMP とレイヤーマスクを使って色々試していたら、アルファチャンネルが0のところにもRGB値を指定できそう、ということは分かった。ピクセル情報タブを表示しておけば、マウスカーソルの位置のRGBA値を確認することができる。A=0でも、RGBにそれらしい値が入ってることは確認できた。
ただ、これをpngで保存すると、そのRGB値が消えてしまう。別のツールを使うしかないのかな…。それとも自分で画像処理をするスクリプトを書くしかないのだろうか…。
OpenGLでテクスチャを描画した際、アルファチャンネルの値が255(不透明)のところと、0(完全に透明)のところの境界で、妙な線が入ってしまう。OpenGLのテクスチャのフィルタ設定で、GL_NEAREST を指定した時はそういう状態にならないのだけど、GL_LINEAR を指定した時はそういう状態になる。
おそらくだけど、不透明部分のRGB値と、透明部分のRGB値を持ってきて、補間して描画色を決めてるから、妙な線が入るのだろうと思っているけれど…。おそらく透明部分のRGB値は(0.0, 0.0, 0.0) になっているのではないか…。だからうっすらと黒い線(灰色の線)が描画されてしまうのではないかと…。
だとしたら、テクスチャ画像のアルファチャンネルが0のところにも、何かしらのRGB値を入れてやれば改善しそう。ただ、どんなツールを使って作業すればそんなことができるのかが分からない…。
GIMP とレイヤーマスクを使って色々試していたら、アルファチャンネルが0のところにもRGB値を指定できそう、ということは分かった。ピクセル情報タブを表示しておけば、マウスカーソルの位置のRGBA値を確認することができる。A=0でも、RGBにそれらしい値が入ってることは確認できた。
ただ、これをpngで保存すると、そのRGB値が消えてしまう。別のツールを使うしかないのかな…。それとも自分で画像処理をするスクリプトを書くしかないのだろうか…。
◎ 2024/06/03追記 :
GIMPでpng保存すると透明部分のRGB値が消えてしまう件は、png保存時のオプション指定で状態を変えることができると分かった。pngで保存(エクスポート)時、オプションの中に、「透明ピクセルの色の値を保存」と言う項目がある。ここにチェックを入れて保存すれば、透明部分のRGB値も残した状態で保存してくれる。たぶん。
[ ツッコむ ]
2024/06/03(月) [n年前の日記]
#1 [nitijyou] 自宅サーバ止めてました
雷が鳴ったので、16:30-18:30の間、自宅サーバ止めてました。申し訳ないです。
夕方、かなりの豪雨になって…。滝のような雨で怖かった…。
夕方、かなりの豪雨になって…。滝のような雨で怖かった…。
[ ツッコむ ]
#2 [cg_tools] GIMPで透明部分のRGB値を残したい
OpenGLでテクスチャを描画すると、透明部分と不透明部分の境界に ―― アルファチャンネル値が0の部分と、255の部分の境界に、変な線が描画されてしまう。テクスチャのフィルタを GL_LINEAR にしているときに、透明部分のRGB値と不透明部分のRGB値で補間して、妙な色が出現してしまうのだろう。たぶん。
その問題を解決するために、透明部分のRGB値に、不透明部分のRGB値も入ってる状態にしたい。GIMP でそういう作業ができそうなのか調べてた。
環境は、Windows10 x64 22H2 + GIMP 2.10.34 Portable。
その問題を解決するために、透明部分のRGB値に、不透明部分のRGB値も入ってる状態にしたい。GIMP でそういう作業ができそうなのか調べてた。
環境は、Windows10 x64 22H2 + GIMP 2.10.34 Portable。
◎ 透明部分に不透明部分の色を引き延ばす :
まずは以下のような画像があるとして。
この画像の透明部分に、不透明部分のRGB値を引き延ばし(?)たい。
元レイヤーは後で重ねたりアルファチャンネルを利用したりするので、まずはレイヤーを複製しておく。レイヤーウインドウで、レイヤーの複製ボタンをクリック。処理したいレイヤーは元レイヤーの下に移動しておく。
![gimp_alpha_delete_ss02.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss02.png)
続いて、不透明部分のRGB値を引き延ばす。複製したレイヤーを選択して、フィルタ → ぼかし → ガウスぼかし。
オプション値はデフォルト値でもいいかな…。うっすらと周囲に色が伸びてるのが分かるかと。
うっすらとした色に見えるのは、その部分のアルファチャンネルに 0 - 255 の間の値が置かれて半透明になっているからなので、アルファチャンネル値を0か255にしてしまう。レイヤー → 透明部分 → アルファチャンネルのしきい値、を選ぶ。
しきい値の値をグンと小さくしてしまう。半透明だった部分が不透明になって、元々の不透明部分が引き延ばされてるような見た目になってくれる。
この画像の透明部分に、不透明部分のRGB値を引き延ばし(?)たい。
元レイヤーは後で重ねたりアルファチャンネルを利用したりするので、まずはレイヤーを複製しておく。レイヤーウインドウで、レイヤーの複製ボタンをクリック。処理したいレイヤーは元レイヤーの下に移動しておく。
![gimp_alpha_delete_ss02.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss02.png)
続いて、不透明部分のRGB値を引き延ばす。複製したレイヤーを選択して、フィルタ → ぼかし → ガウスぼかし。
オプション値はデフォルト値でもいいかな…。うっすらと周囲に色が伸びてるのが分かるかと。
うっすらとした色に見えるのは、その部分のアルファチャンネルに 0 - 255 の間の値が置かれて半透明になっているからなので、アルファチャンネル値を0か255にしてしまう。レイヤー → 透明部分 → アルファチャンネルのしきい値、を選ぶ。
しきい値の値をグンと小さくしてしまう。半透明だった部分が不透明になって、元々の不透明部分が引き延ばされてるような見た目になってくれる。
◎ アルファチャンネルを削除する方法 :
前述の手順では、「アルファチャンネルのしきい値」を使ってアルファチャンネルの値を変化させたけれど、そもそもアルファチャンネルを削除して対応する方法もある。
ただ、レイヤー名を右クリックしたときに表示される、「アルファチャンネルの削除」を選んでしまうと、透明部分が背景色で塗り潰されてしまって、元々透明部分に置いてあったRGB値が消滅してしまう…。以下の画像を見れば分かるかと。透明部分のRGB値が背景色のグレーで塗り潰されてしまっている。
そこで、レイヤーマスクを使って、そのあたりの処理をする。
レイヤーを右クリックして、レイヤーマスクの追加、を選ぶ。
![gimp_alpha_delete_ss07.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss07.png)
レイヤーのアルファチャンネルを移転、を選んでから、「追加」。
![gimp_alpha_delete_ss08.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss08.png)
レイヤーマスクが追加される。レイヤーマスクは 0 - 255 の値を取るグレースケールになってる。
![gimp_alpha_delete_ss09.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss09.png)
ここでおもむろに(?)、レイヤーマスクを削除してしまう。レイヤーを右クリックして、レイヤーマスクの削除、を選ぶ。
![gimp_alpha_delete_ss10.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss10.png)
レイヤーマスクが削除されて ―― つまりは元々あったアルファチャンネル"だけ"が削除された状態になって、透明部分に置かれていたRGB値が目視できるようになる。
以下、参考ページ。
_透過png画像のアルファ値だけを消す方法を教えてください! - 題名の通り... - Yahoo!知恵袋
ただ、レイヤー名を右クリックしたときに表示される、「アルファチャンネルの削除」を選んでしまうと、透明部分が背景色で塗り潰されてしまって、元々透明部分に置いてあったRGB値が消滅してしまう…。以下の画像を見れば分かるかと。透明部分のRGB値が背景色のグレーで塗り潰されてしまっている。
そこで、レイヤーマスクを使って、そのあたりの処理をする。
レイヤーを右クリックして、レイヤーマスクの追加、を選ぶ。
![gimp_alpha_delete_ss07.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss07.png)
レイヤーのアルファチャンネルを移転、を選んでから、「追加」。
![gimp_alpha_delete_ss08.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss08.png)
レイヤーマスクが追加される。レイヤーマスクは 0 - 255 の値を取るグレースケールになってる。
![gimp_alpha_delete_ss09.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss09.png)
ここでおもむろに(?)、レイヤーマスクを削除してしまう。レイヤーを右クリックして、レイヤーマスクの削除、を選ぶ。
![gimp_alpha_delete_ss10.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss10.png)
レイヤーマスクが削除されて ―― つまりは元々あったアルファチャンネル"だけ"が削除された状態になって、透明部分に置かれていたRGB値が目視できるようになる。
以下、参考ページ。
_透過png画像のアルファ値だけを消す方法を教えてください! - 題名の通り... - Yahoo!知恵袋
◎ 元々の透明部分を反映させる :
元画像が持っていた透明部分を反映させる。レイヤーを複製しておいたので、元画像のレイヤーは残ってるはず。右クリックして、不透明部分を選択範囲に、を選ぶ。
この選択範囲でアルファチャンネルを作る。もう一枚のレイヤーを右クリックして、レイヤーマスクの追加、を選ぶ。
選択範囲、を選んで、「追加」。
![gimp_alpha_delete_ss14.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss14.png)
元々の透明部分を反映した状態の見た目になった。
この段階では、透明部分 = アルファチャンネルの値が0ではあっても、そこにRGB値がちゃんと残ってる。ピクセル情報、のタブを表示して、マウスカーソル位置のRGBA値を確認すれば、Aが0だけど、RGB値はちゃんと値が入ってることが分かる。
この選択範囲でアルファチャンネルを作る。もう一枚のレイヤーを右クリックして、レイヤーマスクの追加、を選ぶ。
選択範囲、を選んで、「追加」。
![gimp_alpha_delete_ss14.png](img/_2024/20240603_alphadelete/gimp_alpha_delete_ss14.png)
元々の透明部分を反映した状態の見た目になった。
この段階では、透明部分 = アルファチャンネルの値が0ではあっても、そこにRGB値がちゃんと残ってる。ピクセル情報、のタブを表示して、マウスカーソル位置のRGBA値を確認すれば、Aが0だけど、RGB値はちゃんと値が入ってることが分かる。
◎ RGB値を残したままpng画像としてエクスポート :
[ ツッコむ ]
2024/06/04(火) [n年前の日記]
#1 [cg_tools] 画像処理の膨張、収縮、dilate、erodeについて調べてた
_昨日、
画像の透明部分に、不透明部分のRGB値を引き延ばす処理をGIMPでできそうかどうかを調べてたけど、ガウスぼかしを使って処理するのは何か違うのではないかと思えてきて、引き延ばす(?)感じのフィルタ処理は他にないのか、そういった画像処理は何と呼ばれているのか、そのあたりを調べてた。
おそらくだけど、膨張、収縮(または侵食)と呼ばれる処理がソレなのかなと…。
おそらくだけど、膨張、収縮(または侵食)と呼ばれる処理がソレなのかなと…。
◎ 膨張、収縮 :
一般的に画像処理の世界では、背景は黒(=0)、前景は白(=1)として扱う場合が多いらしい。
そして…。
_モルフォロジー変換 - OpenCV-Python Tutorials 1 documentation
_【画像処理】膨張・収縮処理の原理・特徴・計算式 | 西住工房
_2値画像の膨張・収縮 1 | 画像認識の技術ブログ | マクセルフロンティア株式会社
_【画像処理ノウハウ】膨張とは - Pixelup
_2値画像処理
そして…。
- 白い部分を大きくする/面積を増やす処理を「膨張」「dilate」「Dilation」と呼ぶ。
- 白い部分を小さくする/面積を減らす処理を「収縮」「侵食」「erode」「Erosion」と呼ぶ。
処理内容 | 日本語 | 英語 |
---|---|---|
白い部分を大きくする/面積を増やす | 膨張 | dilate、Dilation |
白い部分を小さくする/面積を減らす | 収縮、侵食 | erode、Erosion |
_モルフォロジー変換 - OpenCV-Python Tutorials 1 documentation
_【画像処理】膨張・収縮処理の原理・特徴・計算式 | 西住工房
_2値画像の膨張・収縮 1 | 画像認識の技術ブログ | マクセルフロンティア株式会社
_【画像処理ノウハウ】膨張とは - Pixelup
_2値画像処理
◎ GIMPの場合 :
フリーで使える画像編集ソフト GIMP にも、同様の処理を行うフィルタがあると知った。
GIMP 2.10.34 Portable Windows版で試してみた。たしかに、白い部分が膨張したり、収縮したりしている。
![gimp210_dilateerode_ss01.png](img/_2024/20240604_dilateerode/gimp210_dilateerode_ss01.png)
- フィルター (Filters) → 汎用 (Generic) → 明るさの最小値 (Dilate)
- フィルター (Filters) → 汎用 (Generic) → 明るさの最大値 (Erode)
GIMP 2.10.34 Portable Windows版で試してみた。たしかに、白い部分が膨張したり、収縮したりしている。
![gimp210_dilateerode_ss01.png](img/_2024/20240604_dilateerode/gimp210_dilateerode_ss01.png)
◎ その昔、争いがあった。らしい :
ただ、この Dilate と Erode については、今から20年前、GIMP 2.4 より前のバージョンでは処理が逆だったらしくて…。
_Bug 156545 - dilate/erode mis-named (refer to opposite operations)
_Bug 768741 - Filter -> Generic -> erode / dilate are reversed
「eordeは黒を増やして、dilateは白を増やすのに、GIMPでは逆になってる。これはバグやろ」
「そうかもしれんけど、関数名を変更すると今まで書かれたスクリプトの動作がおかしくなる。修正したくない」
「ErosionとDilationの言葉の定義を考えたら、この動作はやはり逆だ」
「背景を黒、前景を白と捉えるとそう見えるが、背景を白、前景を黒と捉えればこの動作は正しい。お前の捉え方がおかしいんじゃね?」
「あのなあ…。自分は画像処理の博士号を取得してるんだよ。あらゆる画像処理の文献と照らし合わせてもGIMPの動作は逆だ。これはさすがにおかしい」
「俺は後方互換性を重視して変えないほうがいいと思うけど、一応パッチは書いてみたよ」
「GIMP 2.4でそのパッチを取り込んでみようか…」
(この議論をしている間も「dilate/erodeは逆じゃね?」「またソレかよ! 既出なんだよ。このスレ見ろよ」というやり取りが何度も何度も…)
(そしてGIMP 2.4でDilateとErodeの動作が逆になった)
(そこから数年後)
「おい! この Dilate と Erode は動作が逆だろ。これはバグだ!」
「俺もバグだと思うんだけど『これが正しい』と言い張る連中が居るんよ…。この過去スレを眺めてくれ…」
みたいな。
これは想像だけど…。画像処理の世界では、背景=黒=0、前景=白=1が前提条件になっているけれど、一般人の間では Dilate と Erode から連想される処理内容が真逆なのかもしれないなと…。
この混乱は、結構長い間続いていた(続いている?)っぽい。例えば、GIMPのヘルプドキュメントを眺めると…。
_https://docs.gimp.org/2.8/en/plug-in-dilate.html (GIMP 2.8)
_https://docs.gimp.org/2.10/en/gimp-filter-dilate.html (GIMP 2.10)
_https://docs.gimp.org/2.8/en/plug-in-erode.html (GIMP 2.8)
_https://docs.gimp.org/2.10/en/gimp-filter-erode.html (GIMP 2.10)
_https://docs.gimp.org/2.10/ja/gimp-filter-dilate.html (GIMP 2.10 日本語版)
_https://docs.gimp.org/2.10/ja/gimp-filter-erode.html (GIMP 2.10 日本語版)
お分かりいただけるだろうか? GIMP 2.8 と GIMP 2.10 で、Dilate/Erode の動作が真逆になって説明されてる。更に日本語版に至っては、ページの見出しが「明るさの最小値」なのに、ページ内で「明るさの最大値フィルタは〜」と記述されちゃってる。君は一体どっちのフィルタについて説明してるのだ…?
まあ、そのぐらい、この2つのフィルタについては、扱いが混乱してるのだろうなと…。自分もこうしてメモしてまとめてみるまでは、どっちがどっちなのかちょっと分からなくなってたし…。
_Bug 156545 - dilate/erode mis-named (refer to opposite operations)
_Bug 768741 - Filter -> Generic -> erode / dilate are reversed
「eordeは黒を増やして、dilateは白を増やすのに、GIMPでは逆になってる。これはバグやろ」
「そうかもしれんけど、関数名を変更すると今まで書かれたスクリプトの動作がおかしくなる。修正したくない」
「ErosionとDilationの言葉の定義を考えたら、この動作はやはり逆だ」
「背景を黒、前景を白と捉えるとそう見えるが、背景を白、前景を黒と捉えればこの動作は正しい。お前の捉え方がおかしいんじゃね?」
「あのなあ…。自分は画像処理の博士号を取得してるんだよ。あらゆる画像処理の文献と照らし合わせてもGIMPの動作は逆だ。これはさすがにおかしい」
「俺は後方互換性を重視して変えないほうがいいと思うけど、一応パッチは書いてみたよ」
「GIMP 2.4でそのパッチを取り込んでみようか…」
(この議論をしている間も「dilate/erodeは逆じゃね?」「またソレかよ! 既出なんだよ。このスレ見ろよ」というやり取りが何度も何度も…)
(そしてGIMP 2.4でDilateとErodeの動作が逆になった)
(そこから数年後)
「おい! この Dilate と Erode は動作が逆だろ。これはバグだ!」
「俺もバグだと思うんだけど『これが正しい』と言い張る連中が居るんよ…。この過去スレを眺めてくれ…」
みたいな。
これは想像だけど…。画像処理の世界では、背景=黒=0、前景=白=1が前提条件になっているけれど、一般人の間では Dilate と Erode から連想される処理内容が真逆なのかもしれないなと…。
この混乱は、結構長い間続いていた(続いている?)っぽい。例えば、GIMPのヘルプドキュメントを眺めると…。
_https://docs.gimp.org/2.8/en/plug-in-dilate.html (GIMP 2.8)
_https://docs.gimp.org/2.10/en/gimp-filter-dilate.html (GIMP 2.10)
_https://docs.gimp.org/2.8/en/plug-in-erode.html (GIMP 2.8)
_https://docs.gimp.org/2.10/en/gimp-filter-erode.html (GIMP 2.10)
_https://docs.gimp.org/2.10/ja/gimp-filter-dilate.html (GIMP 2.10 日本語版)
_https://docs.gimp.org/2.10/ja/gimp-filter-erode.html (GIMP 2.10 日本語版)
お分かりいただけるだろうか? GIMP 2.8 と GIMP 2.10 で、Dilate/Erode の動作が真逆になって説明されてる。更に日本語版に至っては、ページの見出しが「明るさの最小値」なのに、ページ内で「明るさの最大値フィルタは〜」と記述されちゃってる。君は一体どっちのフィルタについて説明してるのだ…?
まあ、そのぐらい、この2つのフィルタについては、扱いが混乱してるのだろうなと…。自分もこうしてメモしてまとめてみるまでは、どっちがどっちなのかちょっと分からなくなってたし…。
◎ 「明るさの最小値」「明るさの最大値」ってなんやねん :
それはともかく、GIMPのフィルタ名の「明るさの最小値」「明るさの最大値」って意味不明だよなと…。どんな処理をしてくれそうなのか全く分からない。どうして、画像処理の世界で普及しているワードに ―― 「膨張」「収縮」、あるいは「膨張」「侵食」にしなかったのだろう。何か理由があるんだろうか。
そのあたりググってみているうちに、なんとなく理由が分かってきた。そもそも、Photoshopが「明るさの最小値」「明るさの最大値」という訳をしていたのだな…。おそらくGIMPは、Photoshopのソレに倣って、そういうフィルタ名を選んだのではなかろうか。たぶん。
しかし、この珍妙(?)な訳のおかげで、功を奏した面もありそうだなと…。「一体なんだろう、このフィルタ…。何ができるフィルタなのか名前から想像できないから、とりあえず触らないでおこう…」という状態になって、結果的には、「このフィルタは動作が逆だろ?」「いや、これで正しいんだ」「いやいや、やっぱりおかしいって。逆だって。バグだよコレ」というバトル(?)が日本国内では起きずに、我々は平穏な日々を過ごせてこれたのかもしれない…。なんちてぽっくん。
そのあたりググってみているうちに、なんとなく理由が分かってきた。そもそも、Photoshopが「明るさの最小値」「明るさの最大値」という訳をしていたのだな…。おそらくGIMPは、Photoshopのソレに倣って、そういうフィルタ名を選んだのではなかろうか。たぶん。
しかし、この珍妙(?)な訳のおかげで、功を奏した面もありそうだなと…。「一体なんだろう、このフィルタ…。何ができるフィルタなのか名前から想像できないから、とりあえず触らないでおこう…」という状態になって、結果的には、「このフィルタは動作が逆だろ?」「いや、これで正しいんだ」「いやいや、やっぱりおかしいって。逆だって。バグだよコレ」というバトル(?)が日本国内では起きずに、我々は平穏な日々を過ごせてこれたのかもしれない…。なんちてぽっくん。
◎ 余談。不透明部分のRGB値を引き延ばせるかどうか :
さておき。GIMPの「明るさの最小値」を使って、「膨張」「Dilate」を ―― 透明部分に、不透明部分のRGB値を引き延ばせるかどうか試してみたけれど…。
元々のRGB値をそっくりそのまま膨張してくれる点はいいけれど、数回実行してみると、妙なところまで色が回り込んだ見た目になってしまう時があるなと…。例えば以下の事例では、右下のあたりに不自然な緑色が回り込んでしまっている。
![gimp_dilate_ss01.gif](img/_2024/20240604_dilateerode/gimp_dilate_ss01.gif)
まだ、ガウスぼかしを使って引き延ばしたほうが、自然な見た目になりそうな気もしてきた…。
元々のRGB値をそっくりそのまま膨張してくれる点はいいけれど、数回実行してみると、妙なところまで色が回り込んだ見た目になってしまう時があるなと…。例えば以下の事例では、右下のあたりに不自然な緑色が回り込んでしまっている。
![gimp_dilate_ss01.gif](img/_2024/20240604_dilateerode/gimp_dilate_ss01.gif)
まだ、ガウスぼかしを使って引き延ばしたほうが、自然な見た目になりそうな気もしてきた…。
[ ツッコむ ]
2024/06/05(水) [n年前の日記]
#1 [prog] 自作スクリーンセーバを修正した
以前作ったOpenGLを使うスクリーンセーバと同様の描画処理をするデモプログラムを、Lenovo IdePad S10-2上でも動くように修正した。
_mieki256/ssp3droadgl
元のプログラムは、4096x4096のテクスチャ画像を使っていたけれど、IdeaPad S10-2 (Intel Atom N270, Mobile Intel 945GSE Express)の最大テクスチャサイズは2048x2048だったので、テクスチャが読み込めなくて正常な描画にならなかった。今回、1024x1024のテクスチャ画像も用意して、GL_MAX_TEXTURE_SIZE が 4096 より小さい場合はそちらのテクスチャ画像を読み込むように修正してみた。
動作確認したところ、小さいテクスチャを拡大しながら描画してるせいか、カメラに近いビルボードや路面はボケボケになってしまった。でもまあ、描画されないよりはマシかなと…。
ちなみに、30 - 50FPSぐらいで動いてくれた。結構善戦している。20FPS に固定すれば処理落ちせずに済む感じ。
_mieki256/ssp3droadgl
元のプログラムは、4096x4096のテクスチャ画像を使っていたけれど、IdeaPad S10-2 (Intel Atom N270, Mobile Intel 945GSE Express)の最大テクスチャサイズは2048x2048だったので、テクスチャが読み込めなくて正常な描画にならなかった。今回、1024x1024のテクスチャ画像も用意して、GL_MAX_TEXTURE_SIZE が 4096 より小さい場合はそちらのテクスチャ画像を読み込むように修正してみた。
動作確認したところ、小さいテクスチャを拡大しながら描画してるせいか、カメラに近いビルボードや路面はボケボケになってしまった。でもまあ、描画されないよりはマシかなと…。
ちなみに、30 - 50FPSぐらいで動いてくれた。結構善戦している。20FPS に固定すれば処理落ちせずに済む感じ。
◎ 1024x1024以下しか使えないGPUはあるのだろうか :
GL_MAX_TEXTURE_SIZE が 2048 どころか 1024 を返してくるハードウェアはあるのだろうか。以下のページを眺めてみたけれど…。
_OpenGL capabilities report: GL_MAX_TEXTURE_SIZE
大半のGPUは最低でも2048を返してくるように見える。1024を返してくるGPUは数えるほどしかない。
ただ、VIA/S3G UniChrome Pro が1024を返すようではある。ググったところ、VIA K8M800チップセットに統合されていたGPUらしい。
_S3 Chrome - Wikipedia
一応、MSI K8MM-V という、VIA K8M800 + VT8237R が載ってるM/Bを持ってるから、テストしてみようか…。
でも、あのM/Bは Linuxのデスクトップ環境すら真っ当に表示できないほどに動作が遅かったはず。ウインドウを移動するだけでも、ベロンベロンと書き換えてる様子が分かるぐらいに遅かった。あのハードウェアでOpenGLを動かそうと思う人はもう居ないんじゃないか…? そもそも今の時代に使ってる人はどれほど居るのか…。いや、それを言ったら、今の御時勢、スクリーンセーバ自体を動かす人が一体どれだけ居るのかと言う話にもなりそうだけど。
_OpenGL capabilities report: GL_MAX_TEXTURE_SIZE
大半のGPUは最低でも2048を返してくるように見える。1024を返してくるGPUは数えるほどしかない。
ただ、VIA/S3G UniChrome Pro が1024を返すようではある。ググったところ、VIA K8M800チップセットに統合されていたGPUらしい。
_S3 Chrome - Wikipedia
一応、MSI K8MM-V という、VIA K8M800 + VT8237R が載ってるM/Bを持ってるから、テストしてみようか…。
でも、あのM/Bは Linuxのデスクトップ環境すら真っ当に表示できないほどに動作が遅かったはず。ウインドウを移動するだけでも、ベロンベロンと書き換えてる様子が分かるぐらいに遅かった。あのハードウェアでOpenGLを動かそうと思う人はもう居ないんじゃないか…? そもそも今の時代に使ってる人はどれほど居るのか…。いや、それを言ったら、今の御時勢、スクリーンセーバ自体を動かす人が一体どれだけ居るのかと言う話にもなりそうだけど。
[ ツッコむ ]
#2 [nitijyou] ヤマダ電機に行ってきた
夕食を食べ終えてから、ヤマダ電機まで電動自転車で行ってきた。一番近いルートを選んで走ったので片道20分ぐらいで到着。
ここ最近、親父さんがホイールの壊れたマウスをずっと使っている点が近気になっていて…。PC操作を教えるときに自分もちょっと触ったりするのだけど、ホイールを回したらスクロールがめちゃくちゃになって、コレを使い続けるのはもう無理だろうと。代替品を購入したいけど、親父さんが使っている BUFFALO BSMBW500LWH (ワイヤレス, Lサイズ, 色は白, 5ボタン)は、もうどこにも売ってない。
_BSMBW500LWH : マウス : Premium Fit | バッファロー
LサイズじゃなくてMサイズでもいいからどこかに売ってないものか、各店舗の店頭で探すしかないかなと…。
幸い、ヤマダ電機の店頭に、同じシリーズの製品が少しだけ残ってた。BUFFALO BSMBW300MBK。ワイヤレス。Mサイズ。色は黒。3ボタン。
_BSMBW300MBK : マウス | バッファロー
LサイズとMサイズの違いがあるので若干小さくなるけれど、形状はほぼ同じだから、そこまで違和感は無いだろう…。色は白から黒になってしまうけど、親父さんは色にこだわりがあるわけでもなさそうだし…。親父さんは4-5ボタンを全く利用していないので3ボタンのほうがありがたいはず。そんなわけで、購入。税込2,164円。
帰宅後調べてみたところ、ヨドバシなら 1,290円だった…。失敗したかな…。というかヤマダウェブコムですら1,278円だし。いやまあ、後者は送料がかかるけど…。
ここ最近、親父さんがホイールの壊れたマウスをずっと使っている点が近気になっていて…。PC操作を教えるときに自分もちょっと触ったりするのだけど、ホイールを回したらスクロールがめちゃくちゃになって、コレを使い続けるのはもう無理だろうと。代替品を購入したいけど、親父さんが使っている BUFFALO BSMBW500LWH (ワイヤレス, Lサイズ, 色は白, 5ボタン)は、もうどこにも売ってない。
_BSMBW500LWH : マウス : Premium Fit | バッファロー
LサイズじゃなくてMサイズでもいいからどこかに売ってないものか、各店舗の店頭で探すしかないかなと…。
幸い、ヤマダ電機の店頭に、同じシリーズの製品が少しだけ残ってた。BUFFALO BSMBW300MBK。ワイヤレス。Mサイズ。色は黒。3ボタン。
_BSMBW300MBK : マウス | バッファロー
LサイズとMサイズの違いがあるので若干小さくなるけれど、形状はほぼ同じだから、そこまで違和感は無いだろう…。色は白から黒になってしまうけど、親父さんは色にこだわりがあるわけでもなさそうだし…。親父さんは4-5ボタンを全く利用していないので3ボタンのほうがありがたいはず。そんなわけで、購入。税込2,164円。
帰宅後調べてみたところ、ヨドバシなら 1,290円だった…。失敗したかな…。というかヤマダウェブコムですら1,278円だし。いやまあ、後者は送料がかかるけど…。
[ ツッコむ ]
2024/06/06(木) [n年前の日記]
#1 [perl][prog] Perlを再勉強中
ふと思い立って、Perlスクリプトを書こうとしてるところ。言語仕様をすっかり忘れているのでググりながら再勉強中。
この日記ページの各記事にはカテゴリ名を付けられるけれど、cat.txt というファイルにカテゴリ名を書いておかないとページ左下のカテゴリ一覧に出てこない。cat.txt に手作業でカテゴリ名を追加してアップロードするのが面倒なので、この日記ページの元ファイル、*.hnf 群をスキャンして cat.txt を作るスクリプトを書けないものかなと…。
何の言語で作ろうか悩んだけれど、この日記ページを見せているWeb日記システム hns が Perl で動いてるので、Perlで書いておけば、ひとまず動くことは動くだろう、と。まあ、処理が遅いかもしれないけれど。
この日記ページの各記事にはカテゴリ名を付けられるけれど、cat.txt というファイルにカテゴリ名を書いておかないとページ左下のカテゴリ一覧に出てこない。cat.txt に手作業でカテゴリ名を追加してアップロードするのが面倒なので、この日記ページの元ファイル、*.hnf 群をスキャンして cat.txt を作るスクリプトを書けないものかなと…。
何の言語で作ろうか悩んだけれど、この日記ページを見せているWeb日記システム hns が Perl で動いてるので、Perlで書いておけば、ひとまず動くことは動くだろう、と。まあ、処理が遅いかもしれないけれど。
◎ Perl Navigatorをインストール :
Visual Studio Code に、Perl Navigator という拡張をインストールしてみた。
_Perl Navigator - Visual Studio Marketplace
_第76回 コーディングを楽にする Perl Navigator 〜便利機能をエディタに簡単導入!(1) | gihyo.jp
_第76回 コーディングを楽にする Perl Navigator 〜便利機能をエディタに簡単導入!(2) | gihyo.jp
_2022年のVSCodeのPerl開発環境 - Mobile Factory Tech Blog
_【プログラム】Perl Navigatorをインストールしました | まるめたり
古い Perl でも動くのが売りらしい。
ただ、これだけでは、Perl の命令を補完入力できなかったので、Perl Completions という拡張も入れてみた。
_Perl Completions - Visual Studio Marketplace
_Perl Navigator - Visual Studio Marketplace
_第76回 コーディングを楽にする Perl Navigator 〜便利機能をエディタに簡単導入!(1) | gihyo.jp
_第76回 コーディングを楽にする Perl Navigator 〜便利機能をエディタに簡単導入!(2) | gihyo.jp
_2022年のVSCodeのPerl開発環境 - Mobile Factory Tech Blog
_【プログラム】Perl Navigatorをインストールしました | まるめたり
古い Perl でも動くのが売りらしい。
ただ、これだけでは、Perl の命令を補完入力できなかったので、Perl Completions という拡張も入れてみた。
_Perl Completions - Visual Studio Marketplace
[ ツッコむ ]
以上、6 日分です。