KINOKO WEB

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

スクリプト Into Layer

2016-02-04 | 画像処理
//  2016/2/5
//  開いてるドキュメントを、レイヤーを重ねて1つのファイルに統合します。
// ファイル名のわかいドキュメントに統合します。
// 統合して不要なったドキュメントは保存しないで閉じます。

// ドキュメント数を格納します。
var docuLength = documents.length;
// ドキュメント数が2以上のときに実行します。
if (docuLength >= 2) {
  // ダイアログを表示します。
  flag = confirm("開いているドキュメントを統合します。");
  // OKボタンを押されたら実行します。
  if (flag == true) {
    //  ドキュメント0をアクティブにします。
    activeDocument = documents[0];
    // レイヤー名をドキュメント名に変更します。
    activeDocument.artLayers[0].name = activeDocument.name;
    // ドキュメント数-1回分、ループします。
    for (i = 1; i < docuLength; i++){
      // ドキュメント1をアクティブにします。
      activeDocument = documents[1];
      // ドキュメント名を格納します。
      docuName = activeDocument.name;
      // レイヤーをコピーします。
      activeDocument.artLayers[0].copy();
      // アクティブドキュメントを閉じます。
      activeDocument.close(SaveOptions.DONOTSAVECHANGES);
      // ドキュメント0をアクティブにします。
      activeDocument = documents[0];
      // レイヤー0 をアクティブにします。
      activeDocument.activeLayer = activeDocument.artLayers[0];
      // レイヤーを貼り付けます。
      activeDocument.paste();
      // 複製したレイヤー名前をドキュメント名に変更します。
      activeDocument.artLayers[0].name = docuName ;
    }
  }
}

スクリプト Resize Resolution

2016-02-03 | 画像処理
// 2015/3/20
// 実物大に画像をリサイズします。

pixel = prompt("ものさしツールの長さ(pixel)を入力してください。","");
if (pixel) {
cm = prompt("スケール(cm)を入力してください。","");
if (pixel) {
//単位をpixelに設定します。
preferences.rulerUnits = Units.PIXELS;
//ドキュメントの横幅を調べます。
w = activeDocument.width.value;
//ドキュメントの縦幅を調べます。
h = activeDocument.height.value;
//ドキュメントの解像度を調べます。
res = activeDocument.resolution;
//解像度を計算します。
cmPixel = cm / pixel
//リサイズする横幅を計算します。
x = w * cmPixel;
//リサイズする縦幅を計算します。
y = h * cmPixel;
//単位をcmに設定します。
preferences.rulerUnits = Units.CM;
//画像サイズを変更します。, ResampleMethod.BICUBICSHARPER
activeDocument.resizeImage(x, y, res, ResampleMethod.BICUBICSHARPER);
}
}

スクリプト Layer Visible Lower

2016-02-02 | 画像処理
// 2015/2/11
//  作業中のレイヤーより下にある全てのレイヤーの表示状態を切り替えます。
//  非表示のなっている時は表示に、表示のときは非表示にします。
//  作業中のレイヤーは表示します。
//  作業中のレイヤーより上の全てのレイヤーは非表示にします。

// ファイルがない場合は、スクリプトを実行しません。
if (documents.length != 0) {
//  作業中のファイルを、docObjに格納します。
var docObj = activeDocument;
// レイヤー数を、layCountに格納します。
var layCount = docObj.artLayers.length;
// 作業中のレイヤー名を、layNameに格納します。
var layName = docObj.activeLayer.name;
// 表示状態を格納する変数です。
var layVisible = false;
// 作業中のレイヤーとの位置関係を格納する変数です。下にあるとfalseです。
var position = true;
for (i = 0; i < layCount; i++) {
// レイヤーの位置関係を調べます。
if (position) {
// 作業中のレイヤーの名前と一致するか調べます。
if (docObj.artLayers [i].name != layName)
{
// 上にあるレイヤーです。
} else{
// 作業中のレイヤーです。
// layVisibleとpositionにtrueを格納します。
layVisible = true; position = false;
}
} else {
// 下にあるレイヤーです。表示状態を反転させてlayVisibleに格納します。
layVisible = ! docObj.artLayers [i].visible;
}
// レイヤーの表示状態を設定します。
docObj.artLayers [i].visible = layVisible;
}
}

スクリプト Layer Visible

2016-02-01 | 画像処理
// 2015/2/2
// 作業中のレイヤーの1つ上のレイヤーの表示設定を反転します。

// ドキュメントがない場合は、実行しません。
if(documents.length!=0) {
  // 作業中のファイルを、docObjに格納します。
  var docObj=activeDocument;
  // 作業中のレイヤー名を、layNameに格納します。
  var layName=docObj.activeLayer.name;

  // レイヤー0から順番に、作業中のレイヤー名と一致するか確認します。
  // 一致したら、作業中のレイヤー番号です。nに格納します。
  var n=0;
  while(docObj.artLayers[n].name!=layName)n++;

  // 作業中のヤイヤーの1つ上のレイヤーの表示状態を反転させます。
  // 作業中のイレヤー番号が0のときは、エラーが発生するので実行させません。
  if(n!=0)docObj.artLayers[n-1].visible=!docObj.artLayers[n-1].visible;
}

スクリプト 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 );
}

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

設定

2015-09-12 | 画像処理


[TIME] M=[PARAMS]
[SOURCE_FILE_NAME] [PARAMS]












Digital Photo Professional 4









Intuos








Windows 10のご紹介

今ならWindows10へ無償アップグレードすることができます
さあ、今すぐ予約を

非表示にする。











タスクバーを右クリックでプロパティ













DPP4.0

2015-06-30 | 画像処理

キヤノンのRAW現像ソフト Digital Photo Professional(DPP)が、
メジャーバージョンアップしてDPP4.0になったのは、
去年の6月26日。1年前のこと。

最初は、一部の機種にしか対応していなかったけど、
私の使用しているEOS 70DやEOS 5D Mark IIにも対応したことから、
今年の3月から使いはじめた。

DPP4.0は、いいところもあるけれど、現像時間が長いなどの、
決定的なデメリットもあった。
また、いくつかのバグも含まれているかんじだった。

現像処理中にメモリリークしているようで、
徐々にメモリがいっぱいに占有されてしまう。
現像処理が最後まで完了できないことがあった。

特に、複数のフォルダに保存されたRAWデータを同時に現像処理すると、
最後まで完了できないことが多かった。

2015年6月10日に、4.2.32がリリースされ、メモリリークがおさまったようだ。
しばらく、複数フォルダの現像処理をして様子をみることにしよう。





DPP4.0

2015-06-06 | 画像処理
RAWで撮影したデータを、
実物のスイセンノウのお花とパソコンのモニターを比べながら、調整してみた。

私のカメラは、マゼンタ周辺の、青みが足りなくなる傾向にある。
ウメ、ハマナス、アザミ、レンゲなどの写真は注意が必要だ。
また、最近確認した印刷物では、データに対して青が足りない傾向にあった。
やはり、色校も重要。


スイセンノウも、青みが足りなかった。
そこで、マゼンタの色域に対して調整してみた。
色相を青よりにして、彩度を上げてみた。
彩度を上げていくと、実物のイメージに近づいていくのだが、
階調がなくなっていく。

また全体に対して、少し暗くした。


実は、「図鑑NEO 花」の62ページにスイセンノウがのっている。
2012年の6月に撮影したもので、お花の形が悪い。
青みもたりない。
いつか、差し替えたいものだ。






スイセンノウ 流山市 2015年6月5日 13:48
EOS 70D, EF100mm F2.8L IS USM マクロ



明るさ:-0.33





マゼンタの色相(H):-10.0
マゼンタの彩度(S):2.0







ゼラニウムのように赤い花は、マゼンタと比べると、色相のずれは少ない。
レッドの色域をいじった。
彩度を上げると、あっというまに階調がなくなっていくので注意。
葉っぱに対しては、グリーンの色域をいじった。
彩度は、それほど劇的に変化しなかった。

お花にあわせて、-0.33暗くしたら、葉っぱは暗くなりすぎた。
Photoshopで、葉っぱを明るくした。





ゼラニウム 流山市 2015年6月6日 12:12
EOS 70D, EF28mm F2.8 IS USM



明るさ:-0.33
レッドの色相(H):-5.0
レッドの彩度(S):1.0
グリーンの色相(H):5.0
グリーンの彩度(S):1.0




DPPは、バージョン4.0になって、
8つの各色域に対して、色相、彩度、輝度の調整が可能になった。
ありがたいことだが、現像時間はとってもかかるようになった。
実用するのが、たいへんなくらい時間がかかる。

デジタルレンズオプティマイザ

2015-03-24 | 画像処理
キヤノンのRAW現像ソフト Digital Photo Professionalに、デジタルレンズオプティマイザという機能がある。
レンズの収差や回折、ローパスフィルターといった理想からのずれを補正するという。

ためしてみた。

私の場合、等倍以上のマクロ撮影になると、回折による小絞りボケが気になってくる。
ピントのあう幅をひろげたいので、絞りこむ。
そうすると、小絞りボケがどんどん大きくなる。

マンネンタケの管孔の写真。
レンズはMP-E65mm F2.8、絞りはf10。
デジタルレンズオプティマイザは80%。




デジタルレンズオプティマイザで処理すると、
コントラスが高くなった気がする。



画像処理

2015-02-25 | 画像処理

(1) ファイル名の変更、撮影日時を追加。





(2) 撮影間隔がしきい値(秒を)超えたら別フォルダへ。









(3) バッチ処理 フォルダごとにM=BとM=Cを生成。







(4) BridgeからM=BとM=Cを含む3つの画像を開く。




(5) Photoshopで、ショートカットキーF5に登録しておいたスクリプトを実行。


Photoshop

2014-03-17 | 画像処理


/ 親フォルダ
// ∟作業フォルダ
//   ∟M=B画像
//   ∟M=C画像
//   ∟Main画像
// ***************************************************************************************************************
var docObj = activeDocument;
var folderPath = docObj.path //作業フォルダパスを格納します。
var folderName = folderPath.name //作業フォルダ名を格納します。
var parentPath = folderPath.parent //親フォルダパスを格納します。
var jadgeA = documents.length==1 //開いてる画像が1つの場合だけ実行します。
var jadgeA = jadgeA&&docObj.artLayers.length==4 //レイヤーが4枚のときだけ実行します。
var jadgeA = jadgeA&&docObj.artLayers [0].name=="@M=C@" //一番上のレイヤー名が"@M=C@"ときだけ実行します。

if (jadgeA==true){
// =======================================================
//一番上のレイヤーを非表示、2、3番目のレイヤーを表示します。
// =======================================================
docObj.artLayers [0].visible = false;
docObj.artLayers [1].visible = true;
docObj.artLayers [2].visible = true;

// =======================================================
//レイヤーを統合します。
// =======================================================
var idFltI = charIDToTypeID( "FltI" );
executeAction( idFltI, undefined, DialogModes.NO );

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

// =======================================================
//作業フォルダ内のすべてのファイルと作業フォルダを削除します。
// =======================================================
if (folderName.length==2){
var fileList = folderPath.getFiles();
for(i=0;i<=fileList.length;i++)
{new File(fileList[i]).remove()} //作業フォルダ内のすべてのファイルを削除します。
new File(folderPath).remove() //作業フォルダを削除します。
}

// ***************************************************************************************************************
//マージするTIFF画像を開きます。
// ***************************************************************************************************************

// =======================================================
//作業フォルダの有無を調べます。
// =======================================================
var fileList = parentPath.getFiles(); //親フォルダ内のファイル一覧を取得します。
var fileLength = fileList.length; //親フォルダ内の全ファイル数を格納します。
n=0;
workTiffPresent = false;
workFolderPresent = false;
workFolderJadge = false;
do {
fName = fileList[n].name;
fLength = fName.length;
if (fLength == 2) { //フォルダ名が2文字の場合に実行します。
workFolder = fileList[n]; //フォルダのパスを格納します。
TiffList = workFolder.getFiles("*.tif"); //TIFF画像をリストします。****ERROR*****
TiffLength = TiffList.length; //TIFF画像を数えます。

if (TiffLength >= 3){ //Tiff画像が3個以上の場合に実行します。
// =======================================================
//M=Bファイルの有無を調べます。
// =======================================================
i=0
jadgeMB = false;
jadge = true;
do {
TiffName = TiffList[i].name; //ファイル名を格納します。
if (TiffName.indexOf("M=B")>=0){
pathMB = TiffList.splice(i,1); //M=Bファイルのパスを格納し、ファイルリストからM=Bファイルを削除します。
jadgeMB = true;
jadge = true;
}else{
if (i >= TiffLength - 1){
jadge = true;
}else{i++;
}
}
}while (jadge == false)

// =======================================================
//M=Cファイルの有無を調べます。
// =======================================================
i=0
jadgeMC = false;
jadge = false;
TiffLength = TiffList.length; //M=BファイルをのぞいたTIFF画像数です。
do {
TiffName = TiffList[i].name; //ファイル名を格納します。
if (TiffName.indexOf("M=C")>=0){
pathMC = TiffList.splice(i,1); //M=Bファイルのパスを格納し、ファイルリストからM=Bファイルを削除します。
jadgeMC = true;
jadge = true;
}else{
if (i >= TiffLength - 1){jadge = true}else{i++};
}
}while (jadge == false);

workFolderPresent = jadgeMB&&jadgeMC; //M=BファイルとM=Cファイルがみつかったら、作業フォルダと認定します。

if (workFolderPresent == true){ //作業フォルダがあるときに実行します。
workFolderJadge = true;
}else{ //作業フォルダがないときに実行します。
if (n>=fileLength - 1){
workFolderJadge = true; //ファイル数分実行したらループをぬけます。
showBrige (); //作業フォルダがない場合はBrigeを表示します。
}else{n++}; //nをインクリメントします
}
}else{ //Tiff画像が3個以上の場合に実行します
if (n>=fileLength - 1){
workFolderJadge = true; //ファイル数分実行したらループをぬけます。
showBrige (); //作業フォルダがない場合はBrigeを表示します。
}else{n++}; //Tiff画像が3個以上なかったら、nをインクリメントし、ループを繰り返します。
}
}else{ //フォルダ名が2文字以外の場合に実行します。
if (n>=fileLength - 1){
workFolderJadge = true; //ファイル数分実行したらループをぬけます。
showBrige (); //作業フォルダがない場合はBrigeを表示します。
}else{n++}; //nが全ファイル数に到達してなかったらnをインクリメントし、ループを繰り返します。
}
} while (workFolderJadge == false)

// =======================================================
//作業フォルダがある場合は、M=B, M=C, Main画像を開きます。
// =======================================================
if (workFolderPresent == true) {
//~ var idOpn = charIDToTypeID( "Opn " );
//~ var desc1 = new ActionDescriptor();
//~ var idnull = charIDToTypeID( "null" );
//~ desc1.putPath( idnull, new File(pathMB) ); //M=B画像を開きます。
//~ executeAction( idOpn, desc1, DialogModes.NO );
//~ desc1.putPath( idnull, new File(pathMC) ); //M=C画像を開きます。
//~ executeAction( idOpn, desc1, DialogModes.NO );
//~ desc1.putPath( idnull, new File(TiffList[0]) ); //Main画像を開きます。
//~ executeAction( idOpn, desc1, DialogModes.NO );
open (new File(pathMB));
open (new File(pathMC));
open (new File(TiffList[0]));
}
}


// ***************************************************************************************************************
//M=BとM=Cの画像を統合します。
// ***************************************************************************************************************

mB = -1
mC = -1

//ドキュメントが3つの場合だけ実行します。
if (documents.length==3){

//ドキュメント数を求めます。
dLength = documents.length;

//メイン、M=B、M=Cファイルを識別します。
for (i=0; i<dLength; i++)
{dName = documents[i].name;

if (dName.indexOf("M=B")>0){MB=i; MBName=dName}
if (dName.indexOf("M=C")>0){MC=i; MCName=dName}}

main = dLength-MB-MC
mainName = documents[main].name;

// =======================================================
//M=Bをメインにコピーします。
activeDocument = documents[MBName]
activeDocument.artLayers[0].copy();
//M=Bを閉じます。
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
//M=Bをメインにコピー貼り付けます。
activeDocument = documents[mainName]
activeDocument.paste();

// =======================================================
//M=Cをメインにコピーします。
activeDocument = documents[MCName]
activeDocument.artLayers[0].copy();
//M=Cを閉じます。
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
//M=Cをメインにコピー貼り付けます。
activeDocument = documents[mainName]
activeDocument.paste();

// =======================================================
activeDocument.artLayers[0].duplicate(); //レイヤーを複製します。
activeDocument.artLayers[0].name = "@M=C@" //複製したレイヤーの名前を"@M=C@"にします。
activeDocument.artLayers[0].visible = false; //複製したレイヤーを非表示にします。
layerMasc (); //2番目のレイヤをマスクします。
}
// =======================================================
//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 layerMasc (){
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 );
}