KINOKO WEB

きのこ関係です。ときどき植物。

スクリプト Channels View

2016-01-31 | 画像処理
// 2016/1/31
//  クイックマスクモードのとき、RGBチャンネルの表示設定を判定します。

// ドキュメントが1以上なら実行します。
if (documents.length > 0) {
  // チャンネル数が3以上だったら実行します。
  if (activeDocument.channels.length > 3){
    // Rチャンネルの表示設定を反転します。
    activeDocument.channels[0].visible = ! activeDocument.channels[0].visible;
    // Gチャンネルの表示設定を反転します。
    activeDocument.channels[1].visible = ! activeDocument.channels[1].visible;
    // Bチャンネルの表示設定を反転します。
    activeDocument.channels[2].visible = ! activeDocument.channels[2].visible;
  }
}

スクリプト Merge_HeZe

2016-01-30 | 画像処理
// ***************************************************************************************************************
// ソース画像にスタック画像のレイヤーをコピーします。
// 作成日 2015/2/14
// 変更日 2016/1/26
// Zerene Stacker と Helicon Focus の両方のスタック画像に対応しました。
// フォルダ名の前後に@をついたフォルダを識別します。
// スタック画像の名前は、ソース画像名 + 半角スペース + メソード名
//  親フォルダ
//  ∟作業フォルダ : @000@
//    ∟Main画像 : X2_00000.tif
//    ∟Focused
//      ∟B(2 4)画像 : X2_00000 B,Radius2,Smoothing2.tif
//      ∟B(4 8)画像 : X2_00000 B,Radius4,Smoothing8.tif
//  D:ZereneImages
//  ∟DMap画像 : IMG_1254 DMap.tif
//  ∟PMax画像 : IMG_1254 PMax.tif
// ***************************************************************************************************************

// ドキュメント数が1以上のときに実行します。
if (documents.length>=1){
// アクティブドキュメントを格納します。
var mainDocu = activeDocument
// 作業フォルダパスを格納します。
var wFPath = mainDocu.path
// 作業フォルダ名を格納します。
var wFName = wFPath.name
// ZereneImagesフォルダパスを格納します。
var zSPath = new Folder("/d/ZereneImages")

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  マスク作業の完了したドキュメントで、
//  レイヤーを統合して、Photoshopデータで保存します。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レイヤー0の名前を格納します。
var layName = mainDocu.artLayers [0].name
//  名前の先頭と最後の文字を格納します。
var aDDDa = layName.charAt(0) + layName.charAt(layName.length-1)
// レイヤー0の名前の先頭と最後の文字が@のときに実行します。
if (aDDDa=="@@"){
  // =======================================================
  // ”@000@”フォルダがあれば、フォルダ内のファイルと作業フォルダを削除します。
  // フォルダ名の先頭と最後の両方に@があったら、作業フォルダ有りです。
  // =======================================================
  // 作業フォルダ名の先頭と最後の文字を格納します。
  var a000a = wFName.charAt(0) + wFName.charAt(wFName.length-1)
  // "@@"だったら実行します。
  if (a000a == "@@"){
    // ZereneImagesフォルダのTIFF画像をリストします。
    var fileList = zSPath.getFiles("*.tif");
    // メイン画像名を格納します。
    mainName = activeDocument.name.split(".");
    mainName = mainName[0];
    // メイン画像名を含んだTIFF画像を削除します。
    for(i=0;i<fileList.length;i++){
      if (fileList[i].name.search(mainName)>=0){new File(fileList[i]).remove()};
    }
    // Focusedフォルダのファイルをリストします。
    var fileList = new Folder(wFPath + "/Focused").getFiles();
    //  Focusedフォルダ内のすべてのファイルを削除します。    
    for(i=0;i<fileList.length;i++){new File(fileList[i]).remove()};
    // 作業フォルダのファイルをリストします。
    var fileList = wFPath.getFiles();
    //  作業フォルダ内のすべてのファイルを削除します。    
    for(i=0;i<fileList.length;i++){new File(fileList[i]).remove()}
    //  作業フォルダを削除します。
    //new File(wFPath).remove()
    wFPath.remove()
    //  親フォルダパスを格納します。
    var wFPath = wFPath.parent
  }
  // =======================================================
  // 名前に"のコピー"を含むレイヤーは非表示にします。他は表示します。
  // =======================================================
  for(i=0;i<mainDocu.artLayers.length;i++){
    // layName = mainDocu.artLayers[i].name;
    searchCount = mainDocu.artLayers[i].name.search(/のコピー/g);
    if (searchCount >= 0){jadge = false} else {jadge = true};
    mainDocu.artLayers [i].visible = jadge;
  }
// =======================================================
// 画像を統合します。
// =======================================================
var idFltI = charIDToTypeID( "FltI" );
executeAction( idFltI, undefined, DialogModes.NO );

// =======================================================
// 親フォルダにフォトショップ画像を保存します。
// =======================================================
// 拡張子を削除したファイル名を格納します。
var docName = mainDocu.name.split(".");
// フォトショップ形式で保存します。
psdSave (wFPath+"/"+docName[0]+".psd");
// ファイルを閉じます。
mainDocu.close(SaveOptions.DONOTSAVECHANGES);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ソース画像を開きます。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // フォルダ内のファイル一覧を取得します。
  var fileList = wFPath.getFiles();
  // フォルダ内の全ファイル数を格納します。
  var fileLength = fileList.length;

  for (i=0; i<fileLength; i++) {
    // フォルダのパスを格納します。
    wFPath = fileList[i];
    // フォルダ名を格納します。
    fName = wFPath.name
    // フォルダ名の先頭と最後の文字を格納します。
    var a000a = fName.charAt(0) + fName.charAt(fName.length-1)
    // フォルダ名の先頭と最後の文字が@のとき実行します。
    if (a000a == "@@") {
      // TIFF画像をリストします。
      TiffList = wFPath.getFiles("*.tif");
      // ソース画像をひらきます。
      open (new File(TiffList[0]));
      // ループをぬけます。  
      break;
    }
  }
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// マスク作業をスタンバイ状態にします。
// スタック画像を、メイン画像のレイヤーに移動します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ドキュメント数が1以上のときに実行します。
if (documents.length>=1){
  // アクティブドキュメントを格納します。
  mainDocu = activeDocument
  if (mainDocu.artLayers.length == 1){
    // 0のときは、レイヤーのコピーとマスクを実行しません。
    jadge = 0;
    // アクティブドキュメントのパスを格納します。
    folderPath = mainDocu.path;
    // Helicon Focus画像を処理します。
    // Focused フォルダのスタックしたTIFF画像をリストします。
    StackList = new Folder(folderPath + "/Focused").getFiles("*.tif");
    // 順序を反転します。
    StackList.reverse();
    // 画像数を格納します。
    StackLength = StackList.length;
  
    // Helicon Focus画像を処理します。
    for (i=0; i<StackLength; i++){
      stackLayerOpen (i, jadge);
      jadge = jadge + 1;
    }

    // Zerene Stacher画像を処理します。
    // /d/ZereneImagesフォルダのスタックしたTIFF画像をリストします。
    StackList = zSPath.getFiles("*.tif");
    // メイン名を格納します。
    mainName = mainDocu.name.split(".");
    mainName = mainName[0];
    // 画像数を格納します。
    StackLength = StackList.length;

    for (i=0; i<StackLength; i++){
      // スタック名を格納します。
      StackName = StackList[i].name;
      // スタック名をスペース文字で分割します。
      StackName = StackName.split("%");
      // スタック名にメイン名を含んでいるいる画像を処理します。
      if (StackName[0] == mainName){
        stackLayerOpen (i, jadge);
        jadge = jadge + 1;
      }
    }
    // スタック画像処理を1回以上おこなったら実行します。
    if (jadge > 0){
      // レイヤー0の名前を変更します。前後に@をつけます。
      activeDocument.artLayers[0].name = "@" + activeDocument.artLayers[0].name + "@";
      // レイヤー数-1 を格納します。
      layersNum = activeDocument.artLayers.length - 1;
      // 一番下のレイヤーを削除します。
      activeDocument.artLayers[layersNum].remove();
      //
      for (i=0; i<(layersNum - 1) / 2; i++){
        // コピーしたレイヤーを非表示にします。
        activeDocument.artLayers[i * 2].visible = false;
      }
      // 下から2番目のレイヤーをアクティブにします。
      activeDocument.activeLayer = activeDocument.artLayers[layersNum-2];
      // レイヤーマスクを選択します。
      layerMaskSelect ();
    }
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Photoshop形式で保存します。psdPathは、ファイルパスを指定します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function psdSave (psdPath){
fileObj = new File(psdPath);
psdOpt = new PhotoshopSaveOptions();
psdOpt.alphaChannels = true;
psdOpt.annotations = true;
psdOpt.embedColorProfile = true;
psdOpt.layers = true;
psdOpt.spotColors = true;
activeDocument.saveAs(fileObj, psdOpt, true, Extension.LOWERCASE);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ビープ音を鳴らし、Brigeを表示します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function showBrige (){
app.beep (); //ビープ音を鳴らします。
var idshowFileBrowserPalette = stringIDToTypeID( "showFileBrowserPalette" );
var desc1 = new ActionDescriptor();
var idMxm = charIDToTypeID( "Mxm " );
desc1.putBoolean( idMxm, false );
var idNwVw = charIDToTypeID( "NwVw" );
desc1.putBoolean( idNwVw, false );
executeAction( idshowFileBrowserPalette, desc1, DialogModes.NO );
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// アクティブレイヤーのマスクを選択します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function layerMaskSelect (){
 var idslct = charIDToTypeID( "slct" );
var desc2 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref1.putEnumerated( idChnl, idChnl, idMsk );
desc2.putReference( idnull, ref1 );
var idMkVs = charIDToTypeID( "MkVs" );
desc2.putBoolean( idMkVs, false );
  executeAction( idslct, desc2, DialogModes.NO );
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// スタック画像を開いてメインドキュメントにレイヤーをコピーします。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function stackLayerOpen (imageNumber, jadgeMask){
    // 画像を開きます。
    open (new File(StackList[imageNumber]));
    // メソード名を格納します。
    LayerName = activeDocument.name.split(" ");
    LayerName = LayerName[1].split(".");
    LayerName = LayerName[0];
    // レイヤーをコピーします。
    activeDocument.artLayers[0].copy();
    // アクティブドキュメントを閉じます。
    activeDocument.close(SaveOptions.DONOTSAVECHANGES);

    // メインドキュメントをアクティブにします。
    activeDocument = mainDocu;
    // レイヤー0 をアクティブにします。
    activeDocument.activeLayer = activeDocument.artLayers[0];
    // レイヤーを貼り付けます。
    activeDocument.paste();
    // 複製したレイヤー名前をメソードにします。
    activeDocument.artLayers[0].name = LayerName ;
    // ループ初回以外は実行します。
    if (jadge > 0){
      // レイヤーを複製します。
      activeDocument.artLayers[0].duplicate();
      // 2番目のレイヤをマスクします
      layerMask ();
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レイヤーをマスクします。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function layerMask (){
var idMk = charIDToTypeID( "Mk " );
var desc2 = new ActionDescriptor();
var idNw = charIDToTypeID( "Nw " );
var idChnl = charIDToTypeID( "Chnl" );
desc2.putClass( idNw, idChnl );
var idAt = charIDToTypeID( "At " );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref1.putEnumerated( idChnl, idChnl, idMsk );
desc2.putReference( idAt, ref1 );
var idUsng = charIDToTypeID( "Usng" );
var idUsrM = charIDToTypeID( "UsrM" );
var idHdAl = charIDToTypeID( "HdAl" );
desc2.putEnumerated( idUsng, idUsrM, idHdAl );
executeAction( idMk, desc2, DialogModes.NO );
}

キツネノボタン

2016-01-29 | 植物 白バック
よくみかけるのはケキツネノボタン。
注意深くさがさないせいか、キツネノボタンは1度もであったことはなかった。

去年の夏、桧枝岐の林道で、毛の少ないのをみかけたので撮影しておいた。

どうやら、キツネノボタンっぽい。
毛深さだけでは、見分けることはできないらしい。





キツネノボタン 桧枝岐村 2015年8月15日 12:36
EOS 70D, EF28mm F2.8 IS USM






キツネノボタン 桧枝岐村 2015年8月15日 13:51
EOS 70D, EF100mm F2.8Lマクロ IS USM



キツネノボタンの痩果をよくみると、角張ってるのは片側だけ。
下の写真では左側が角張ってる。
ケキツネノボタンは、両側が角張ってる。
断面を撮影しとかないとわかりにくいね。


キツネノボタンの痩果(左)とケキツネノボタンの痩果(右)

カネノナルキ

2016-01-24 | 植物 白バック
3年前に撮影したカネノナルキ。

今年の冬、ウメの花は、いつもよりはやく咲いたりしてるが、
カネノナルキはいつもどおりのかんじ。




カネノナルキ 流山市 2013年1月29日 7:53
EOS 60D, EF100mm F2.8Lマクロ IS USM






カネノナルキ 流山市 2013年1月30日 12:39
EOS 60D, EF100mm F2.8Lマクロ IS USM

スエヒロタケ

2016-01-23 | きのこ
冬のきのことして、エノキタケやヒラタケは有名だけど、
スエヒロタケも元気に生えてるのをみかける。
というか、いつでも生えてるね。




スエヒロタケ 柏市 2016年11月11日 14:53
EOS 70D, EF100mm F2.8Lマクロ IS USM

ゴボウ

2016-01-21 | 植物 黒バック
この前の雪のあとから、少し寒くなった。
きのう、床屋でスポーツ刈りにしたら、やたらとすうすうする。





ゴボウ 野田市 2015年7月19日 6:44
EOS 70D, EF100mm F2.8Lマクロ IS USM

Zerene Stacher

2016-01-18 | 画像処理
もう、何年も前からインストールしてあるソフト。
ぜんぜん、戦力になってない。
最近になって、すこしいじりはじめた。
以前気になっていたバグは、いつのまにか修正されてるようだ。
使い方をわすれてしまったので、個人用のメモを。
まちがって理解してるとこもあるかも。


1. 画像を開く



2. スタック

(Both)を選択すると、PMax画像とDMap画像をいちどにつくってくれる。





3. DMapの設定

PMaxは、パラメータの設定は不要だけど、
DMap は、contrast threshold、Estimation Radius、Smoothing Radius の設定で、
スタック画像の結果が少しずつかわってくる。


Set contrast threshold が表示されたら、スライダーを動かして設定する。
被写体の周辺の背景にできるノイズを、黒く塗りつぶし、被写体はなるべく黒くならないようにする。
とりあえず50くらいに。デフォルトは30。
値を小さくすると、エッジ部はよく表現されるようになるが、コントラストない領域はのっぺらぼうになる傾向にある。
値を大きくすれば、もちろん、逆の傾向になるが、値を大きくしすぎるとのっぺらぼうの領域が発生する。

詳細はヘルプで




Estimation Radius、Smoothing Radiusは、 メニューの[Option] [Preferences]から設定する。




Percentlile をオンにしておくと、
設定した値が採用され、スタック中にダイアログが表示されなくなるので便利かも。





4. 選択画像をスタック

スタック結果がいまひとつの場合、
いちぶの画像を選択してスタックしてレタッチすると、改善することがある。





5. レタッチ

DMapは、ソース画像の色合いに近い仕上がりだけど、エッジ部や毛などの細い線の表現はにがて。
PMaxは、エッジ部や細い線に耐性のある反面、ノイズっぽい画質。
レタッチは、DMapとPMaxのおいしいところ取り。
場合によっては、DMapのパラメーター変更した画像、いち部分のスタック画像、ソース画像の、
おいしいところをいただくこともある。

ソース画像をいただくときは、Shift を押しながらドラックすると、ソース画像の表示をかえることができるので便利。




6. レタッチした画像をコミット




7. 保存




メニューの[Option] [Preferences]で設定しておくと便利なこと。
TIFF 16bitで保存する。

ファイル名が、「IMG_0001 DMap」のように、
ソース画像の最初のファイル名が採用さるように変更。
{mininp:0} {method}





8. プロジェクトを閉じる





9. バッチ処理

複数のカットをいちどにスタックするときに便利。






スタックするカットをフォルダごとにわけておいて実行すると簡単。
作成したバッチは保存しておくと、毎回よびだして利用できる。





10. 設定

Use input file profiles for ZS screen displays にチェックを入れると、
画面の発色が変になる。




外人の発音は、ズリンスタッカーと聞こえる。
ピントはずれんスタッカーとおぼえるといいかもしれない。




StackShot
CamRanger:M3は未対応
Magic Lantern:いまのところ70D, M3には未対応

Helicon Focus vs Zerene Stacker

2016-01-17 | 画像処理

Focus stacking
CombineZP, Auto-Montage, Helicon Focus, Zerene Stacker をテストしたら、Zerene Stackerがよかったみたい。

Zerene Stacker のPMaxは、Helicon Focus のPMaxより優れているようにおもう。
Hericon Focus のPMaxは、ノイズと画素の粗さが目立ってくる。
しかし、DMapは、画像によって優劣がかわってくる。
Heridon Focus のDMapは、色調やコントラストの再現性に優れていることが多い。

以下は、Helicon Focusが勝利したケース。


ヒイロタケの管孔。


Helicon Focus, Depth map, Radius:8, Smoothing:4(デフォルト設定)



Zerene Stacker, Pyramid max



Zerene Stacker, Depth map, Estimation Radius:10, Smoothing Radius:5(デフォルト設定)Cntrast threshold:50



ツリガネタケの管孔。


Helicon Focus, Depth map, Radius:8, Smoothing:4(デフォルト設定)



Zerene Stacker, Pyramid max



Zerene Stacker, Depth map, Estimation Radius:10, Smoothing Radius:5(デフォルト設定)Cntrast threshold:50



コガネタケのかさ表面。


Helicon Focus, Depth map, Radius:8, Smoothing:4(デフォルト設定)



Zerene Stacker, Pyramid max



Zerene Stacker, Depth map, Estimation Radius:10, Smoothing Radius:5(デフォルト設定)Cntrast threshold:50



キシメジ属のヒダ。
Zerene StackerのPMaxは正常に見えるが、実は暗部のしまりが悪い。


Helicon Focus, Depth map, Radius:8, Smoothing:4(デフォルト設定)



Zerene Stacker, Pyramid max



Zerene Stacker, Depth map, Estimation Radius:10, Smoothing Radius:5(デフォルト設定)Cntrast threshold:50

ヒノキ

2016-01-08 | 植物 白バック
プールの更衣室で、
「パンツ忘れた!」と先生。
「余分にもってるから俺のかしてやるよ」と吉田さん。
先生はおびえるように遠慮した。

たしかに人の使いふるしたパンツで泳ぐのは、気分のいいものではないが、
それよりも、吉田さんのパンツには、でっかい文字で白くペイントされている。
吉田さんのいろいろなメッセージがかきこまれている。

そんなパンツをはいて泳ぐのは、けっこう勇気がいるかもしれない。







ヒノキ 柏市 2016年1月8日 13:30
EOS M3, EF28mm F2.8 IS USM