Xử lý ảnh


0

Tôi có rất nhiều hình ảnh từ một thư mục cần được trừ vào một hình ảnh khác (thư mục khác) và tôi không biết làm thế nào để tự động làm điều đó trong quy trình hàng loạt. Bất kỳ ý tưởng?

Sau đây là các mục tiêu cho tệp bó:

  • Tạo một thư mục đầu ra
  • Tạo thư mục Proc_path chỉ cho các tệp được xử lý
  • Trừ hình ảnh từ thư mục sang hình ảnh khác từ một hình ảnh khác danh mục

Đã làm hết sức mình để tạo ra một phần của kịch bản này. Xin lỗi nếu nó quá lộn xộn, tôi biết tôi không làm đúng. Tôi hy vọng bạn hiểu.

@echo on
setlocal EnableDelayedExpansion

set "in_path=E:\Proc\Mer\"
set "out_path=E:\Proc\Abcde"
set "two_path=E:\Proc\Me\"
set "proc_path=E:\Proc\Proc_Mer_Fi"

::Don't modify the following variables
set "yearDay="
set "fileList="

md %out_path%
md %proc_path%

::Process all *.tif files in input path
cd /d "%in_path%"
for %%a in (*.tif) do (
   set "fileName=%%a" 
   if %1 == 001-031 goto :condition1 ::reg/leap
   if %2 == 032-059 goto :condition2 ::reg
   if %3 == 032-060 goto :condition2 ::leap
   if %4 == 060-090 goto :condition3 ::reg
   if %5 == 061-091 goto :condition3 ::leap
   if %6 == 091-120 goto :condition4 ::reg
   if %7 == 092-121 goto :condition4 ::leap
   if %8 == 121-151 goto :condition5 ::reg
   if %9 == 122-152 goto :condition5 ::leap
   if %10 == 152-181 goto :condition6 ::reg
   if %11 == 153-182 goto :condition6 ::leap
   if %12 == 182-212 goto :condition7 ::reg
   if %13 == 183-213 goto :condition7 ::leap
   if %14 == 213-243 goto :condition8 ::reg
   if %15 == 214-244 goto :condition8 ::leap
   if %16 == 244-273 goto :condition9 ::reg
   if %17 == 245-274 goto :condition9 ::leap
   if %18 == 274-304 goto :condition10 ::reg
   if %19 == 275-305 goto :condition10 ::leap
   if %20 == 305-334 goto :condition11 ::reg
   if %21 == 306-335 goto :condition11 ::leap
   if %22 == 335-365 goto :condition12 ::reg
   if %23 == 336-366 goto :condition12 ::leap

   :condition1
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_jan.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition2
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_feb.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition3
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_mar.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition4
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_apr.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition5
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_may.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition6
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_june.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition7
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition8
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_aug.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition9
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_sep.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition10
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_oct.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition11
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_nov.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :condition12
   gdal_calculate --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! --calc="((one-two)/(one+two))" --two=%two_path%\two_abc_dec.tif --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! --extent=INTERSECT
   goto end
   :: Move processed files to a different directory
   for %%a in (!fileList!) do move %%a "%proc_path%" >nul

Rất nhiều vấn đề ở đây, không biết bắt đầu từ đâu. Tại sao bạn kiểm tra tham số dòng lệnh% 1 đến% 23? Bạn đang truyền 23 tham số cho tệp bó? FYI, chỉ cho phép% 1 đến% 9; sau đó, bạn phải sử dụng shift chỉ huy. Xem shift /? để biết thêm.
wardies

Bên trong bạn for vòng lặp, sử dụng call :conditionX thay vì goto, nếu không, bạn sẽ nhảy ra khỏi vòng lặp và không bao giờ quay lại nó. Hãy chắc chắn để đóng vòng lặp của bạn trước khi khai báo các trình xử lý điều kiện. Bên trong xử lý điều kiện, thay vì goto end, sử dụng goto :eof.
wardies

Tại sao hạn chế :: Đừng sửa đổi các biến sau set "yearDay="set "fileList="? Bạn phải sửa đổi chúng, như tiếp theo được sử dụng trong dal_calculate các cuộc gọi. Và trong các cuộc gọi đó, bạn sử dụng, ví dụ: %in_path%\A!yearDay!.Q_WER.Tera.tif kết quả là E:\Proc\Mer\\A... (dấu gạch chéo kép). Còn những năm nhuận thì sao?
JosefZ

@JosefZ xem chỉnh sửa cho tên tệp. Đó là lý do tại sao set "yearDay=set "fileList=" được đặt thành trống. Bởi vì có nhiều tập tin và năm thay đổi. Tôi hy vọng tôi nhận được quan điểm của bạn?
user

@wardies, bởi vì có nhiều điều kiện tôi phải đưa ra đó là lý do tại sao tôi nghĩ đến việc tạo ra tới 23%. Làm thế nào tôi sẽ sửa đổi tập lệnh này? Tôi thực sự không biết.
user

Câu trả lời:


1

Tập lệnh bó bên dưới duyệt tất cả các tệp của một ????????*.tif mẫu trong %in_path% thư mục không có đệ quy. Theo mục nhập, các ký tự thứ 2-8 của tên tệp cho biết ngày Julian YearDay của yyyyddd mẫu. Duyệt các tệp được xác định bởi các điều kiện tiếp theo được chỉ định trong câu hỏi và nhận xét bổ sung.

  • lúc đầu, %in_path% thư mục duyệt để tạo một danh sách YearDay s: xem ban đầu for %%Q vòng lặp; sau đó
  • mỗi YearDay xử lý ở bên ngoài for %%p vòng lặp ở đâu, như là một hiệu ứng phụ, được tính toán chung ngày của yyyy-mmm-dd định dạng;
  • các tập tin giống nhau YearDay được xử lý tách biệt trong một vòng lặp 'cho %% G' bên trong và có một danh sách các tệp (giống nhau YearDay ) điền vào;
  • danh sách đề cập cuối cùng được hoàn thành ngay sau khi vòng lặp bên trong sẽ kết thúc.

Mật mã

@ECHO OFF >NUL
@SETLOCAL enableextensions enabledelayedexpansion

set "in_path=E:\Proc\Mer"
set "out_path=E:\Proc\Abcde"
set "two_path=E:\Proc\Me"
set "proc_path=E:\Proc\Proc_Mer_Fi"
md %in_path%   2> NUL
md %out_path%  2> NUL
md %two_path%  2> NUL
md %proc_path% 2> NUL

pushd "%in_path%\"

set "yearDay="
set "fileName="

::Get list of all YearDays in input path
set "yearDayList=x"
for /F "tokens=* delims=" %%Q in ('dir /B ????????*.tif') do (
  set "fileName=%%Q"
  set "yearDay=!fileName:~1,7!"
  Call :ItemToList !yearDayList! !yearDay!
)
@set yearDayList=%yearDayList:x= %
@echo yearDayList=%yearDayList%

::Process all *.tif files in input path day by day
for %%p in ( %yearDayList%) Do ( 
  set "yearDay=%%p"
  @echo .
  set /A "julYr=!yearDay:~0,4!"
  set "julDayS=!yearDay:~4,3!"
  set "month="
  set "monthDay="
  rem avoid octal conversions
  if "!julDayS:~0,2!"=="00" (
    set /A "julDn=!julDayS:~2,1!"
  ) else (
    if "!julDayS:~0,1!"=="0" (
      set /A "julDn=!julDayS:~1,2!"
    ) else (
      set /A "julDn=!julDayS!"
    )
  )
  call :months !julYr! !julDn!
  set "mDay2=0!monthDay!"
  set "mDay2=!mDay2:~-2!"
  @echo p^:  yearDay !yearDay!   yyyy-mmm-dd !julYr!-!month!-!mDay2!
  @rem p^:  yearDay !yearDay!   yyyy-mmm-d !julYr!-!month!-!monthDay!

  rem Process all *.tif files of the same YearDay in input path
  set "fileList="
  for /F "tokens=* delims=" %%G in ('dir /B "?%%p*.tif"') do (
    set "fileName=%%G"
    set "fileList=!fileList!!fileName! "
    @echo G^: !fileName!
  )
  REM   @echo fileList=!fileList!
  REM   @echo Move processed files ^(one day^) to a different directory
  REM   for %%a in (!fileList!) do (
  REM     @echo move %%a "%proc_path%\"
  REM   )
)
popd
goto :allcommon

:allcommon
@ENDLOCAL
@goto :eof

:ItemToList
rem yearDayList yearDay
SETLOCAL enableextensions enabledelayedexpansion
  set "myYDList=%1"
  set "myYearDay=%2"
  set "myYList="
  call :myset "myYList=%%myYDList:%myYearDay%=%%"
  if "%myYList%"=="%myYDList%" set "myYDList=%myYDList%x%myYearDay%"
ENDLOCAL & set "yearDayList=%myYDList%"
exit /B

:months
rem %1=julYr
rem %2=julDn
@SETLOCAL enableextensions enabledelayedexpansion
set "mymonth=XXX"
set /a "dayom=%2"
set "allmonths=Xjanfebmaraprmayjunjulaugsepoctnovdec"
set /a "ii=1"
rem leap year test makes use of integer only arithmetic
set /A "yearModi=(%1/4)*4"
If "%1"=="%yearModi%" (
  rem leap year
  set "daycounts=32 61 92 122 153 183 214 245 275 306 336 367"
) Else (
  rem non-leap year
  set "daycounts=32 60 91 121 152 182 213 244 274 305 335 366"
)
For %%G in (%daycounts%) do (
  if %2 lss %%G (
    call :myset "mymonth=%%allmonths:~!ii!,3%%"
    rem set /a "dayom+=1"
    goto :commmonths
  )
  set /a ii=!ii!+3
  set /a "dayom=%2-%%G+1"
)
:commmonths
ENDLOCAL & (set "month=%mymonth%"
set "monthDay=%dayom%")
exit /B

:myset
rem procedure to set indirect variable replace/substring
rem i.e. dynamic %StrToFind% instead of literal StrToFind
rem common: set "varNew=%varOld:StrToFind=NewStr%"
rem call :myset "varNew=%%varOld:%varToFind%=NewStr%%"
rem call :myset "varNew=%%varOld:!varToFind!=NewStr%%"
rem applicable to %NewStr% as well
rem i.e. dynamic %CharsToSkip% instead of literal CharsToSkip
rem common: set "varNew=%varOld:~CharsToSkip,chars_to_keep%"
rem call :myset "varNew=%%varOld:~%CharsToSkip%,chars_to_keep%%"
rem call :myset "varNew=%%varOld:~!CharsToSkip!,chars_to_keep%%"
rem applicable to %chars_to_keep% as well
set %1
exit /B

Có vài (un) chung các kỹ thuật và quy tắc về khả năng đọc mã được sử dụng trong tập lệnh:

  • một số thủ tục kết thúc với ENDLOCAL & set "globalVar=%localVar%"; bằng cách đặt ENDLOCAL & SET các lệnh trên một dòng chúng ta có thể SET một biến ngay trước khi nội địa hóa kết thúc bởi ENDLOCAL chỉ huy;
  • thủ tục :ItemToList nối tham số thứ hai được truyền đến hết tham số thứ nhất khi và chỉ khi không có ở đó; không phổ biến x dấu phân cách được thay thế bằng phổ biến space trong danh sách đầy đủ chỉ;
  • thủ tục :months trả về tên tháng ngắn và số ngày trong tháng đối với năm nhuận / năm không nhuận; tham số đầu vào là năm và julian số ngày;
  • thủ tục :myset tham gia để thiết lập thay thế / chuỗi con gián tiếp; tự giải thích bởi rem s trong mã;
  • lưu ý một đoạn mã đứng đầu avoid octal conversions trong for %%p vòng lặp; hơi phức tạp, vì các giá trị số sẽ được coi là bát phân bởi trình thông dịch lệnh khi có tiền tố bằng 0 ...
  • lưu ý tất cả các cặp liên tục SETLOCAL với ENDLOCALpushd với popd
  • nếu () Các dấu ngoặc đơn bao trùm một khối mã gồm nhiều dòng, sau đó mỗi dòng ) kết thúc ngoặc được thụt vào một dòng mới vào cùng một cột với từ khóa tương ứng for hoặc là if ngoại trừ else được tính là một phần của if;
  • tất cả các đường dẫn, như là một vấn đề của nguyên tắc chung, được định nghĩa với không dấu gạch chéo ngược ; thêm \ dấu gạch chéo ngược khi đường dẫn là đã sử dụng Nếu cần

Tôi nên đặt lệnh gdal_calculate ở đâu?
user

Xin lỗi, tôi biết không có gì về xử lý hình ảnh hoặc thậm chí về gdal_calculate lệnh ... Điều duy nhất tôi muốn là giúp bạn có được giá trị các biến tôi đã nhận ra của bạn gdal_calculate gọi, bất kể (dis) sử dụng đúng cách của họ.
JosefZ

Đây là đầu ra của mã thứ hai bạn đã đưa ra yearDayList= 2009274 2009275 2009276 . p: yearDay 2009274 yyyy-mmm-dd 2009-oct-01 G: A2009274.Q_WER.Tera.tif . p: yearDay 2009275 yyyy-mmm-dd 2009-oct-02 G: A2009275.Q_WER.Tera.tif . p: yearDay 2009276 yyyy-mmm-dd 2009-oct-03 G: A2009276.Q_WER.Tera.tif
user

Tôi nên đặt lệnh gdal_calculate trong phần mã nào? Trong mã đầu tiên của bạn, bạn có thể đặt lệnh gdal_calculate.
user

Khi tôi cố gắng chèn gdal_calculate sau rem Process all *.tif files of the same YearDay in input path set "fileList=" mã chạy và chỉ tính một hình ảnh từ thư mục đầu vào. Và vẫn còn rất nhiều lỗi như Missing operator. Missing operator. Invalid attempt to call batch label outside of batch script.RuntimeError: --two =% Two_path% \ Two_abc_! tháng! .tif 'không tồn tại trong hệ thống tệp và không được công nhận là tên tập dữ liệu được hỗ trợ.' Nhưng tôi biết tôi đang tiến gần đến.
user

0

Đây là mã: tất cả move s được lặp lại, Tất cả nguyên bản gdal_calculate các cuộc gọi được thay thế bằng một !month! thay vì jan, feb vv Kết quả gdal_calculate được lặp lại thành năm dòng, mỗi dòng = một --parameter. Một số dường như khá kỳ lạ, đặc biệt là những người có chứa (đang phát triển) !fileList!

@ECHO OFF >NUL
@SETLOCAL enableextensions enabledelayedexpansion
set "in_path=E:\Proc\Mer\"
set "out_path=E:\Proc\Abcde"
set "two_path=E:\Proc\Me\"
set "proc_path=E:\Proc\Proc_Mer_Fi\"

set "yearDay="
set "fileList="
set "fileName="

md %in_path%   2> NUL
md %out_path%  2> NUL
md %two_path%  2> NUL
md %proc_path% 2> NUL

::Process all *.tif files in input path
pushd "%in_path%"
for %%G in (*.tif) do (
  set "fileName=%%G"
  set "yearDay=!fileName:~1,7!"
  set /A "julYr=!fileName:~1,4!"
  set "julDayS=!fileName:~5,3!"
  set "month="
  rem avoid octal conversions
  if "!julDayS:~0,2!"=="00" (
    set /A "julDn=!julDayS:~2,1!"
  ) else (
    if "!julDayS:~0,1!"=="0" (
      set /A "julDn=!julDayS:~1,2!"
    ) else (
      set /A "julDn=!julDayS!"
    )
  )
  call :months !julYr! !julDn!
  set "fileList=!fileList!!fileName! "
  @echo .
  @echo !fileName! yearDay=!yearDay! julYr=!julYr! julDn=!julDn! month=!month!
  rem next lines display original gdal_calculate call
  rem each line = one --parameter
  rem some seem to be quite bit weird
  rem in particular those containing !fileList!
  @rem echo gdal_calculate 
  @echo --outfile=%out_path%\Abcde!yearDay!.Q_WER.Tera.tif !fileList! 
  @echo --calc="((one-two)/(one+two))" 
  @echo --two=%two_path%\two_abc_!month!.tif 
  @echo --one=%in_path%\A!yearDay!.Q_WER.Tera.tif !fileList! 
  @echo --extent=INTERSECT
)
rem Move processed files to a different directory
for %%a in (%fileList%) do @echo move %%a "%proc_path%"
goto :allcommon

:allcommon
popd
@ENDLOCAL
@goto :eof

:months
rem %1=julYr
rem %2=julDn
@SETLOCAL enableextensions enabledelayedexpansion
set "mymonth=XXX"
set "allmonths=Xjanfebmaraprmayjunjulaugsepoctnovdec"
set /a "ii=1"
rem leap year test makes use of integer only arithmetic
set /A "yearReal=%1"
set /A "yearModi=(%yearReal%/4)*4"
If "%yearReal%"=="%yearModi%" (
  rem leap year
  set "daycounts=32 61 92 122 153 183 214 245 275 306 336 366"
) Else (
  rem non-leap year
  set "daycounts=32 60 91 121 152 182 213 244 274 305 335 365"
)
rem echo %daycounts% "%yearReal%" "%yearModi%"
For %%G in (%daycounts%) do (
  if %2 lss %%G (
    call :myset "set mymonth=%%allmonths:~!ii!,3%%"
    goto :commonmonths
  )
  set /a ii=!ii!+3
)
:commonmonths
ENDLOCAL & set month=%mymonth%
exit /B

:myset
%~1
exit /B

cảm ơn bạn đã nỗ lực trong việc tạo ra kịch bản. Biến fileList giữ danh sách tất cả các tên tệp của cùng một YearDay. Và không có cách nào để biết trước có bao nhiêu tệp của cùng một YearDay, vì vậy biến này được khởi tạo thành một chuỗi trống lúc đầu.
user

Bạn có thể giải thích các mã bạn đã sử dụng?
user
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.