こういうソフト(に色機能追加)。

本体(zip圧縮573kB, 2016/08/18)
付属ファイル:画像3枚、メッシュファイル3枚。
付属ファイルの使い方:起動してすぐの「composite」画面でsmpl004.jpgとsmpl004.mshを読みこむ。
次に「src0」画面に切り替えて、smpl005.jpgとsmpl005.mshを読みこむ。
次に「Add Image」でsmpl006.jpgを追加(ただし左右反転)して、smpl006.mshを読み込む。(smpl005 と smpl006 は逆でもよい)。
この時点でのcomposite画像は2つの画像の色を混合しています。そこで左側のコンボボックスで「Mix rate」→「Assign Const」を選び、
smpl005 の首から上を選択して、入力枠をクリックした後にすべて 0 のままで画面をクリック。smpl006 では首から下を選択し
(またはsmpl005の画面からsmpl006の画面に切り替えた後、「Select-Grid」→「Copy 2nd to 1st」 でsmpl005 の選択をコピーし「Invert Squares」で反転し)、
入力枠をクリックした後にすべて 0 のままで画面をクリック。これで色に関しては首から下がsmpl005、首から上がsmpl006 になります。
首のあたりで色の違いが目立ちますが、色を調整するか、切り替わる付近で中間的な混合率にするか、そうすれば目立たないかも。
原理的には元画像側と合成画像側を画像メッシュ共に入れ替えば逆変換になるのですが、姿勢が違う部分があるのでそれなりの調整が必要。
imgmesh説明書
環境
.NET 4.6 が動く環境。多分 Win VISTA SP2 以降。
「msvcr140.dllがない」と文句をいうかもしれませんが、その時はどっかから持ってきてください。
この辺からとか
C++2015にしたので、msvcr120.dll でなく msvcr140.dll です。
起こるかもしれないバグなど
今のところ32bit版です。メモリー上にデータを大きめに広げているので、4096×4096の画像を2枚確保しようとすると Out of Memory と文句を言います。
手順次第では確保できることもありますが、他の操作の際に文句を言います(特に画像の差し替えや保存の時)。
表示倍率を小数点以下3桁まで設定できるため、整数倍でない場合には端数処理の関係で微妙にずれて見える場合があります(スクロールしてよく観察すると分かる)。
画像変形変色機能部分は6スレッドに分散しています。
4096×4096の画像に4000×4000の大きさの20×20メッシュをかけて、1600×1200の画像4枚からそれぞれ1000×1000の部分を混合する変色操作をすると、
4コアの Ivy Bridge core i7 省電力モード 1.2GHz 動作で1回につき、平滑化OFF・ぼかしなしで 8 秒、平滑化ON・ぼかしなしで 10 秒、平滑化ON・合成画像の全体にぼかし1.0で 16 秒ほどかかります。
GPUや特殊なコマンドは使ってないので、多分クロック周波数とコア数に反比例です(Hyper threading は2割増し程度の効果)。
ただし操作する画像が大きい場合、キャッシュの効き方が悪いと3倍くらい時間がかかる事があります。
メッシュの小四角形を凹四角形にしたらおかしくなるかも知れませんが、それは仕方ない。Soften edge は同じ三角形につながっている直線までしか考慮してません。
変更点
・選択エリア外を左クリックでメッシュ選択解除 → 右クリックでメッシュ選択解除 / 色操作時に格子点以外を左クリックした場合は傾斜変色
・Visual C++ 2015に変えた。
・「Copy from 2nd」のパラメータを選択式に変えた。
・合成画面における混合率を有効にした(仮)。背景画像に対する元画像を混合した画像の混合率(仮)。マスクの境界処理はそのまま有効。
・グリッド選択の「Copy 1st to 2nd」はあまり使わないから外した。代わりに「マスクされてない範囲」を加えた。
・レイアウト変えたり、メニューの順番を変えたり、新機能を追加したりしたけど、多分大したことないはず。
起動
dll以外、特に設定や必須ファイルはありません。クリックして起動します。
ウィンドウが2つ現れますが、小さな方(Main Control)が本体です。他のウィンドウを全部消しても、これが残っていたらデータは残ってます。
ただし機能は「新しいウィンドウを開く」「サムネイル一覧」だけです。

メッシュ操作が出来るウィンドウが最大3つ、メッシュを表示しない画像ウィンドウが最大3つまで表示されます。
メッシュ操作が出来るかどうか以外、機能は同じです。メッシュの有無や拡大率を変えて、同じ画像を6つ表示しながら操作が出来ます。
基本表示操作
画像表示・切り替え
初期状態では「変形のための元画像(src/org)」「変色操作を行った元画像(src/clr)」「背景画像(back)」「合成結果の画像(Composite)」の4枚があります。
さらに「元画像(src)」と「参照画像(ref)」をそれぞれ最大3枚追加できます。「元画像(src)」はオリジナルと変色後の2枚が用意されます。
これらは右上のドロップダウンに一覧として表示され、それを選ぶと切り替わります。この一覧は最近選んだ順に並びます。

「to 2nd」ボタンを押すと、リスト2番目の画像に切り替わります。続けて押すと、リスト上位2つが交互に切り替わります。
「to 3rd」ボタンを押すと、リスト3番目の画像に切り替わります。続けて押すと、リスト上位3つが順繰りに切り替わります。
「Compo」は常に合成画面へと切り替えます。
スクロール、倍率、メッシュの一時的非表示
スクロールバーが標準的なwindowsソフトと違う?他の画像ビュアやブラウザの上に持ってきて重ね合わせやすくするために決まってるじゃないですか。
普通のホイール操作は上下スクロールです。
左上にある数字を上下させると拡大縮小できます。0.1倍〜9.8倍の範囲です。直接数値を打ち込んでも可。
さらに「右クリックしながらホイールを回す」で倍率を変更できます(一時的に他の機能に切り替わる場合あり)。
倍率の右側のドロップダウンには3つの「Coord.」が付く選択肢がありますが、これは画像を切り替える際の座標決定方法です。
・Prev. Coord. は、同じ画像を前回表示した時と同じ位置と倍率で表示。
・Pixel Coord. は、今まで表示していた画像と同じ座標と倍率で表示。
・Mesh Coord. はメッシュの番号が大体同じになるような位置と、メッシュの表示面積が大体同じになる倍率で表示します。
メッシュはねじ曲がっている事が多く、メッシュ範囲外の場合もあるので、あくまで大体の位置です。
具体的にいえば、最小二乗法で近似平行四辺形メッシュを計算して、それで一次変換します。
倍率も平均メッシュの面積だけで計算するので、縦横比や回転には対応しません。
メッシュ操作ウィンドウのメニュー「Display」→「Mesh On」のチェックを外すと、メッシュ付ウィンドウのメッシュが消えますが、
この場合はメッシュ変形、メッシュ選択、ファイル関連の操作ができません。色操作はできます。
ファイル操作
色々都合があって、2段階操作になってます。メニュー「File」の中の選択肢を選ぶと、下のようなウィンドウが表示されます。

LOADのときは画像の場合もメッシュの場合も、「現在の状態」と「新たに選択したファイルでの状態」を並べて表示して、「OK」で確定します。
SAVEのときに既にあるファイル名を指定した場合、既存の画像やメッシュと、SAVEするつもりのデータを並べて表示して、「OK」で書き換えます。
「Refer File」ボタンでWindows標準ファイル選択ダイアログが現れるので、ファイルを選んでください。
既にLOAD済みの画像であれば、「Another」ドロップダウンから選ぶ事も出来ます。
「Temporary」は単色画像で、ピクセル数でサイズを指定します。「Current」は、元の状況に戻します。
画像の端ギリギリまで使いたい場合には、ピクセル数を指定して外枠を付け加えられます。
「Margin Color」をクリックすると色選択ダイアログが現れますが、この色は拡大した外枠の色と、png など透明を含む画像の背景色として使います。
ただし一旦読み込んだ画像は透明無しビットマップに変換するので、外枠や背景の色を変えたい時には「Another」による指定ではなく、もう一度ファイルを読み込み直してください。
メッシュ読み込みの際はメッシュの数が変わるために他の画面のメッシュに影響を及ぼす事になります。選択肢はいくつか用意してますが、読み込みは早い段階でやってしまった方が無難。
メッシュ読み込みの際にマスクの現状を変えたくないのなら、マスクに関するチェックを外してください。
座標表示
画面上でマウスをクリックせずに動かすと、マウスが指す点の座標と色情報を画像の上の欄に表示します。
明るさは-384〜+384、色相は色相環を Red->Yellow->Green->Cyan->Blue->Magenta->Red の方向で、この6色を起点に角度により表します。
たとえばRed+30deg = Yellow-30deg が赤と黄色の中間色です。彩度は相対的なもんだと思って使ってください。
画面上でメッシュ操作などのためにクリックしてドラッグした場合は、ドラッグの移動量が表示されます。操作ウィンドウでメッシュのグリッドをクリックした場合には、メッシュ番号も表示されます。
画像のみのウィンドウでドラッグをした場合は、クリックをした始点からの距離と角度が表示されます。
メッシュ操作
メッシュの格子点選択とマウスによる操作
・1点のみ操作
メッシュの格子点部分に小さな四角形があるので、そこをクリックしてそのままドラッグすると、その1点が動きます。
合成画面を表示していれば、マウスを離した時点で部分的に描画を行います。元画像側のメッシュを操作した場合、元画像側は変化しませんが、合成側は変化します。
・複数点操作
1点クリックしてドラッグせずにすぐに離すと、その点の色が変わって選択状態になります。2回クリックすると解除されます。
格子点がない所でクリックして広い範囲をドラッグすると、ドラッグした範囲を表す四角形が表示され、その中の格子点が全て選択状態になります。
既に選択済みの部分に対して同じ事を行うと選択が解除されます。いわゆる排他的論理和(XOR)的動作です。
左クリックを押して操作している最中に、そのまま右クリックを押すと操作を中断して左クリック前の状態に戻します。
画面上を右クリックして動かさずに離すと、すべての選択が解除されます。

メニューのSelect-Gridにある項目を選べば、すべての点を選んだり、反転したり、マスクされていない部分だけ選んだり、既に選んでいる点の右側全部という選択を出来たりします。
反転操作には Grid-wise と Square-wise の2種類あります。Grid-wise は点単位の普通の反転です。
Square-wise は、色操作などの際に小四角形の選択状況を反転させるためにあるのですが、幅が1の選択の場合は原理的に反転させられません。
「右半分と左半分の選択を入れ替える」程度の代物と思ってください。
間違って画面範囲外に点を移動させてしまって選択できなくなった場合には、「すべての点を選択」か、「見える所を選択して反転」で見えない点を選択した後に、
数値指定(後述)で平行移動して画面範囲に戻せます。
他の画像に切り替えた場合も、前の画像のメッシュ選択状態は変化しません。前の画像での選択状態を、今の画像でのメッシュ選択に移す事も出来ます(Copy 2nd to 1st)。
このように選択をした後、選択点を囲む四角形が表示されますが、その範囲内でクリックしてドラッグをすると、選択点がまとめて平行移動します。
合成画面を表示していれば、関係する部分が部分的に再描画されて変形されます。
再描画は操作を行った部分の周辺だけに行うので、それ以外の部分に以前の描画が残る事もあります。目立つ場合はメニューの「Display」→「Redraw」で全体を描き直します。
メッシュの範囲が大きい場合は多少時間がかかります。
複数点が選択されている状態で、選択されていない点を1点だけ選んでドラッグすると、その1点だけが動かせますが、動かし終わると元の選択状態に戻ります。
1個だけ邪魔くさい点があって少しずらしたい場合に、他の点を解除する必要はありません。
選択済みの中の1点だけを少し動かしたい場合は、一旦選択を解除して移動して、その後でまた選択します。
数値入力による画像変形操作
メッシュの形状に合わせて画像を描くので、実際にやるのはメッシュ変形操作ですが。
左側1番目のドロップダウンを「Transform」にすると、その下のドロップダウンに次の選択肢が現れます。
Move-Size:平行移動と拡大縮小(ピクセル単位指定)
Scale-Rotate:倍率指定の拡大縮小と角度指定の回転
Parallerogram:平行四辺形変形(X軸Y軸の角度指定)
Tranpezoid1:台形変形(上辺下辺の倍率指定)
Tranpezoid2:台形変形(左右の辺の角度指定)
Perspective:斜めに倒した風に見せる変形
FanShape:扇形(中心角と中心軸の傾きを指定)
Cylinder:円柱状(左右のでっぱりのピクセル指定)
Ellipse:楕円状(左右のでっぱりのピクセル指定、外へ凸方向のみ)
Rectangle Mesh:長方形単純メッシュ(横間隔と縦間隔をピクセル単位指定)
Array Mesh:ばらばらの格子点を平行四辺形に並べ直す(0.0完全な平行四辺形〜1.0元の状態)
Lean Mesh:格子点を片側に寄せる(0.0で元の状態、正負で左右上下を指定)
Copy in Mesh:同じ画面内で、メッシュの別の部分をコピー
Copy from 2nd:リスト中2番目の画像のメッシュの該当部分をコピー
Simple:座標をそのままでコピー, Rect:現在表示中のメッシュの選択範囲の中に納まるように大きさを調整して、そのままの向きでコピー
X-axis, Y-axis: 選択範囲より少し大きい範囲で計算した2つの平均メッシュの縦軸か横軸のどちらか一方を合わせるように回転と単純拡大をしてコピー
Para:2つの平均メッシュの平行四辺形が合うように一次変換(単純拡大ではない)
Refrection:鏡映
選択済み格子点に対してこれらの操作を行います。ほとんどの場合、2点以上を選択した時に左の入力枠が有効になります
(一部に、四隅を選択された小四角形が1つ以上ある事が条件のものもある)。
入力するために数値枠にカーソルを当ててクリックすると操作を始めて、入力した数値に合わせてメッシュが変形します。
一部、数値入力ではなく「上下左右」などの選択肢の中から選択するものもあります。
画面上で左クリックをしたらメッシュ変形を確定させ、それに合わせて画像変形を行います。右クリックで取り消しです。

一番下に「Angle」という入力項目がある場合がありますが、これは、既に7度だけ回転してしまった長方形のメッシュを、
長方形の形状における横だけ拡大したい場合などに、その角度を指定します。
また、台形や扇形など方向性のある操作で、横方向ではなく縦方向に操作する時に、90度を指定する、または+90度ボタンを押します。
「OriginX」「OriginY」は、拡大や回転の際の中心点を指定します。
選択済み格子点を囲む四角形の中で、中心を(0,0)、右下を(1,1)、左上を(-1,-1)とする相対座標で指定します。下辺で固定して拡大縮小をしたい場合は OriginY=1 とします。
各変形に対する入力数値は意味があったりなかったりしますが、ピクセル数を数えて操作する人もいないでしょうから、適当に入力して試してください。
強いてややこしい例を挙げるなら、「鏡映」と「-1.0倍」は違います。また「-1.0倍」をした場合、各種操作の「上下左右」が表記と逆になることがあります。

台形に変形する操作が3種類ありますが、Tranpezoid1 と Tranpezoid2 は指定方法の違いだけで、縦方向は等間隔平行です。
Perspective は縦方向が等間隔ではなくなります。

メッシュの形を変える事によって画像が変形しますが、これで部分的に拡大したり縮小したりします。この際に「Display」→「Anti Alias」をオンにしていると、平滑化処理を行います。
縮小部分では元画像の関係するピクセルの単純平均によりエイリアス成分を除去します。拡大部分では、元画像での隣接4ピクセルの境界相当付近で簡単な混色を行います。
拡大については簡単な処理なので、縦や横にまっすぐで明確な直線だと、逆にでこぼこが出来てしまうかも。
メッシュの挿入・削除
メッシュの数はすべての画面で同じなので、ここで操作を行うとすべての画面のメッシュが操作されます。
ただしすべて同じように操作するので、メッシュの本数や位置が変わりますが、変形後の画像はあまり変化しません。
色操作を行った後でメッシュの本数を減らす・ずらす操作を行うと、明るさや色が若干波打つように見える事があります。
色操作の式は、滑らかさを出すため、メッシュ四角形の四隅を固定点とする1.5次式で表現されています。
減らした場合は固定点が減るから当然として、ずらした場合にも0.5次分の歪みを感じることがあります。
またメッシュをずらした場合は、マスクの形状も少しずれる事があります。
左側1番目のドロップダウンを「Add-Del Mesh」にすると、メッシュ挿入や削除のメニューが現れます。
Jam Grid:選択した格子点の隣に格子点を詰め込みます。周囲から寄せ集めるので、メッシュの本数は変わりません。
Plow Grid:選択した格子点を避けて、周りにメッシュをずらします。今までメッシュがなかった所にずれる格子点は、近似平行四辺形で拡張します。
Add Mesh:上下左右にメッシュを増やします。マイナスを指定した場合、メッシュを減らす事も出来ます。
Insert Mesh:指定した小四角形の間にメッシュを挿入します。本数が増えます。
Delete Mesh:指定した縦1線、または横1線を削除します。丸々1本選択した場合のみ作動します。
操作方法はメッシュ変形とほぼ同じですが、入力枠が有効になる条件が厳しかったり(削除)、全くなかったり(拡大)します。
メッシュ数は最小6×6、最大160×160で、これを超える指定は受け付けません。
マスク
メッシュの一部の画像変形を抑止して、一部分だけを変形対象にする事ができます。
左側1番目のドロップダウンを「Mask」にした後、格子点選択を行います。四隅または左上三角、右上三角の格子点が選ばれた部分の内部が操作対象になります。
入力枠に「Mask-on」「Mask-off」「Invert」と現れるので、必要なものをクリックし、その後に画像をクリックすると、
Mask-onになった部分が抜けて背景がそのまま表示されます。

マスクは全ての画面に対して1種類のみ存在します。どこで操作しても全てが同じ変化をします。
合成部分とマスク部分の境界は、中間色を使って滑らかにします。デフォルトは2pixel幅ですが、「Display」→「Soften Edge」で0,1,2,4,6 に切り替えられます。
参照画像の設定
参照画像(ref)として追加した画像に関しては、画面サイズ自体は合成画像・背景画像と常に同じです。メッシュも同じものが表示され、色操作以外はどこからでも操作できます。
あくまで画像変形をするための参照ですが、一時的に合成の際の背景を参照画像で置き換える事が出来ます(メニューの「Display」→「Background」)。
参照画像を表示している状態で、左側1番目のドロップダウンの一番下に「replace Ref」という選択肢があるのでこれを選ぶと、表示位置と大きさが変わります。
これをメッシュや他の画像の大きさに合わせて、参照しやすくします。

画面をドラッグすると画像が動きます。画像の表示位置が変わったのではなく、画像やメッシュに対する描画位置が変わるのです。
右クリックしながらホイール操作で画像の大きさが変わりますが、これも拡大率が変わるのではなく、画像やメッシュに対する大きさが変わるのです。
これらは左側の数値枠に数値で入力できますが、その場合には縦横比がずれる事もあります。縦横比を固定したい場合は、縦横比を入力して「cul W」か「cul H」を押すと、
その縦横比を基に計算をします。
満足する位置にできたら、左側1番目のドロップダウンを「Transform」に戻します。
比較のために他の画面に切り替える事もできますが、他の画面では設定モード終了以外の操作はできません。
色操作
合成操作の全体像は次の通りになります。

メッシュ以外で操作できる項目は次の6種類です。一般的な数値の範囲外、たとえば倍率指定のものを0%以下、100%以上に設定可能です。
・混合率 : 同じメッシュ位置の画像の色を、この比率で混合します。合計が100%を超えても明る過ぎ・暗過ぎになるだけです。
・ぼかし : 各点の周囲を使ってぼかします。数値指定する場合はぼかしに用いる範囲の半径で指定します(中心に近いほど重みつけされている)。
・明度 : 黒〜白に対して -384〜+384 の値になります。クリックで決める分には数値を意識することはありませんが、混合率やコントラストはこの数値で計算します。
・コントラスト : 明度を倍率で操作します。単純な倍率操作なので、この数値だけ大きくした場合は、明る過ぎたり暗過ぎたりして、つぶれて見える事もあります。
・彩度 : 色の強さを倍率で操作します。
・色シフト : 内部データとしては色成分2次元ですが、操作は Red-Cyan, Green-Magenta, Blue-Yellow の3方向に加減します。
・色による明度調整 : たとえば青成分を多く含むピクセルをより明るくし、その補色である黄色成分の多いピクセルをより暗くします。
コントラストをかける際に、各メッシュごとの平均明度をさし引くことで、平均的な明るさを変えずにコントラストを変えるなど、
複数の項目を同時に操作する事もできますが、数値で直接入力したりリセットしたりできるのは上の6項目です。
ぼかしも他の色項目と同じようにどんな数値も設定できますが、マイナスは無意味です(0と同じ)。
また、大き過ぎると極端に遅くなります。そこで間引き計算をする選択肢を設けました(「Display」→「Thin Diffusion」)が、単純な間引き計算なのでいわゆるエイリアスが発生します。
ぼかしの設定を変えないまま操作するための一時的な選択肢だと思ってください。
色操作の基本操作
各項目で各メッシュの小四角形の四隅ごと、全部で「縦×横×4」の設定が可能です。メッシュ選択をして選択された四角形に対して操作を行いますが、
選択されなかった隣の部分とは段差ができる場合があります。
色操作に関してはメッシュを消していても操作が可能です。一方、「src/org」「background」「ref」を表示中の場合は操作ができません。
左側1番上のドロップダウンで該当する項目を選択すると、その下に目盛りが付いた画像が現れます。以下、明度で説明します。

左側が全体を同じだけ明るさを増減する目盛り、右側が円筒状に凹凸をつけるための目盛りです(円筒じゃなくて2次関数ですけど)。
凹凸の向きを下の入力枠で指定します。
さらに画面上をクリックすると、選択エリアの中心から見てクリックした側が明るくなり、反対方向が暗くなり、斜めになります。
これで2次関数はすべて指定可能です。

2番目のドロップダウンの「Mesh-Linear」と「Pixel-Linear」の違いは、
メッシュの間隔が不均一な場合でも見た目が2次関数らしく見えるように計算するのが後者です。その後にメッシュを変形したら意味がありませんが。
「Point-wise」は段差がつかないような変色をします。「Conjnc」ボタンを押すと、選択域内にある段差を平滑化します。
「Assign Const」では数値入力で設定します。ちまちまクリックせずに一気に暗くしたり、混合率を数値指定したりできます。
1項目のみのリセットを意図しているのであれば、明度・赤緑青は0、混合率・コントラスト・彩度は100指定です。


左上の座標表示の横に各点の色情報、左下に選択エリアでの明度の範囲を表示しているので、それを元に明度を調整し、
明度0付近で加減することで、影をつける事もできるんじゃないかと思うけど、まだよく試してない。
四角形の四隅の値を入力しますが、四角形の中は三角形ごとの1次式の連結ではなく、四角形ごとの1.5次関数によるなめらかな関数です。
赤緑青に関する数値指定は、内部データが2次元に対して操作が3方向になっている関係で独立して操作できないので、たとえば赤について指定すると緑青はキャンセルされます。
元々が全体的な色調整のための機能なのでこの程度ってことで。
色操作の複合操作
コントラストと彩度については「Contrast 2」「Add Avg」という項目があります。
・Contrast 2 : コントラスト・彩度で明度・色成分に一定倍率をかけた分、各メッシュの平均的な明度・色成分を差し引く。
各メッシュの平均的な明度は変えないで、細かい部分のコントラストを加減します。
・Add Avg : コントラスト・彩度は変えないまま、各メッシュの平均的な明度・色成分を加減する。
こまかい部分のコントラストはそのままで、メッシュ単位で明るさを変えて、細部を見やすくします。
色の場合は、照明の関係で全体的に黄色くなっているときに、その黄色の成分を差し引いて、平均的な色を白に近づけることができます。
直接黄色を加減しても同じことができますが、平均値を加減するので色の判断をしなくて済みます。
ただしこれらは、各メッシュにおける平均値を元に複数の色データを操作しているので、その後にメッシュを動かした場合には変な具合になります。
ひとつのデータを数値指定しても元に戻らないので、init.ボタンで初期化する必要があります。
「各メッシュの色の平均値を求めて、それを加減する」という操作なので、これらを利用して全体的な色調調整だけをするのであれば、メッシュ数を少なめにした方が比較的きれいになります。
メッシュが細か過ぎると、ただのコントラスト・彩度操作と差がなくなります。
また段差のない色変化にするために、「各格子点において、隣接する4つの四角形での平均値の平均を加減する」ため、大きく加減すると隣のメッシュの影響が目立つ場合があります。
