Масштабирование виртуальной линейки (шкалы) до изображений одинакового размера (для нескольких изображений, 360° фотосъемки товара)

Масштабирование виртуальной линейки (шкалы) до изображений одинакового размера (для нескольких изображений, 360° фотосъемки товара)

Представьте, что у вас есть много немного отличающихся изображений такого объекта, снятых с одного и того же расстояния, при этом объект вращается только вокруг своего центра (таким образом, на всех снимках окаменелость будет одинаково большой):

введите описание изображения здесь

Теперь вам также понадобится виртуальная линейка по обеим сторонам фотографий. Но насколько велик объект?

К счастью, вы также сделали снимок с помощью реальной меры, подвешенной таким образом, чтобы она разрезала объект пополам (но рядом с ним)... (также с того же расстояния, то есть с объектом такого же размера):

введите описание изображения здесь

Теперь вам нужно будет наложить виртуальную линейку на все изображения, например:

введите описание изображения здесь

Обратите внимание, что сначала вам придется одинаково масштабировать все фотографии (в LaTeX), пока вы не почувствуете, что они все достаточно большие (как в GIF-изображении в верхней части этого поста).

Можно было бы загружать изображения следующим образом:

\foreach \i in {1,...,16}{
    \begin{figure}
\hspace{0cm}
\vspace{0cm}
\centerline{
\includegraphics[scale=0.1, angle=9,origin=c]{./SourcePictures/Fossil\i.jpg}
}
    \end{figure}
}

Как только масштаб будет в порядке, нам нужно будет выяснить, насколько велико изображение в реальных сантиметрах. Чтобы затем иметь возможность настроить виртуальную линейку так, чтобы ее масштаб был правильным.

Для виртуальной шкалы, изображенной выше, я использовал\fgruler{верхний левый}но я не нашел способа масштабировать его. Я только что обнаружил этот пост:Ось, реальный масштаб, что, возможно, описывает лучший способ? Или нам следует адаптировать размер страниц, чтобы он соответствовал реальным сантиметрам фотографии?

Есть ли у вас предложения, как организовать аккуратный рабочий процесс для этого?

В данном случае я взял:

  • 1 фотография с мерой
  • 16 фотографий вращения лежа (набор 1)
  • 16 картинок вертикального вращения (набор 2)

Обратите внимание, что набор 1 и набор 2 должны быть слегка смещены по вертикали.

Вот пример картинки из набора 1:

введите описание изображения здесь

Вот пример картинки из набора 2:

введите описание изображения здесь

решение1

Думаю, вам нужно что-то вроде этого или похожее:

Следующее решение использует TikZ и TikZ-calc.

а.На первом этапе я помещаю изображение в узел.

б.Затем я добавляю простоесистема координат для этого узла.

в.С помощью среды Scope я могу добавлять любые TikZ-вещи к изображению внутри системы координат.

д1.Подсказка: я использую cmHgI.jpgиз стартового поста здесь; для пользователей, у которых его нет, cmHgI.jpg
он появитсяexample-image.jpg

д2. Подсказка состоит в том, чтобы отмерить «единицу длины» линейки, показанной на рисунке, cmHgI.jpgи использовать ее для всех нарисованных линеек TikZ.

€dit: Я добавил ключ\def\ShowHelps{1} % 1 'yes' 0 'no'

В сыром виде это выглядит так: введите описание изображения здесь

Без вспомогательных средств:

введите описание изображения здесь

\documentclass[a4paper, landscape]{article}
\usepackage[margin=2cm, showframe=false]{geometry} 
\usepackage{mwe} % Dummy images

\usepackage{tikz}
\usetikzlibrary{calc} 
\pgfkeys{/tikz/savevalue/.code 2 args={\global\edef#1{#2}}}

\def\ShowHelps{1} %    1 'yes'        0   'no'
\begin{document}
\centering\begin{tikzpicture}[font=\sffamily,
Help/.style={font=\Huge, red}
]
\node[anchor=south west,inner sep=0pt] (myimage) at (0,0) {    
\IfFileExists{cmHgI.jpg}
  {\includegraphics[scale=0.15]{cmHgI.jpg}}
    {\includegraphics[width=0.75\textwidth]{example-image.jpg}}
};
\begin{scope}[x={(myimage.south east)},y={(myimage.north west)}]
% Restrict the draw area
\clip (0,0) rectangle (1,1);
% Frame around image -  optional
\draw[] (0,0) rectangle (1,1); % optional
% CoSy inside node
\newcommand\ShowHelpCoSy{
  \draw[help lines,xstep=.1,ystep=.1] (0,0) grid (1,1);
  \foreach \x in {0,1,...,9} { \node[anchor=north] at (\x/10,0) {0.\x}; }
  \foreach \y in {0,1,...,9} { \node[anchor=east] at (0,\y/10) {0.\y}; }
}
\ifnum\ShowHelps=1 \ShowHelpCoSy \fi%
\ifnum\ShowHelps=1\fill[Help] (0.5,0.75) circle(3pt) node[above]{(0.5,0.75)};\fi% <-- Position Test

% Now the stuff:
\path[] (0.705,0.4) coordinate(U1) -- (0.705,0.519) coordinate(U2);
\ifnum\ShowHelps=1 \draw[Help] (U1) circle(2pt) node[label=left:U1]{} -- (U2) circle(2pt) node[label=left:U2]{};\fi % show unitlength line

\path let \p1=($(U2)-(U1)$) in 
\pgfextra{  \pgfmathsetlengthmacro{\unitlength}{veclen(\x1,\y1)}   }
[savevalue={\u}{\unitlength}];
\ifnum\ShowHelps=1 \node[Help] at (0.725,0.25) {unitlength U1U2 = \u}; \fi%<--- show unitlength
\ifnum\ShowHelps=1 \draw[blue, transform canvas={xshift=2mm}] (U1) -- +(0,\u);\fi  % Test

% Small Ruler
\draw[very thick] (0.3,0.35) coordinate(A) -- +(0,3*\u);
\foreach \n in {0,1,...,3}{%%
\draw[very thick] ([yshift=\n*\u]A) -- +(-3mm,0) node[left]{\n} 
\ifnum\n=0 node[anchor=west, right=3mm]{cm}\fi;
}%%
\foreach \n in {0.1,0.2,...,3}{%% 
\draw[] ([yshift=\n*\u]A) -- +(-1.5mm,0);
}%%

% Image Ruler y
\draw[very thick] (0,0) coordinate(B) -- +(0,10*\u);
\foreach \n in {0,1,...,10}{%%
\draw[very thick] ([yshift=\n*\u]B) -- +(3mm,0) node[right]{
\ifnum\n=0 \else \ifnum\n=1 \n\,cm \else \n \fi\fi}; 
}%%
\foreach \n in {0.1,0.2,...,10}{%% 
\draw[] ([yshift=\n*\u]B) -- +(1.5mm,0);
}%%

% Image Ruler x
\draw[very thick] (0,1) coordinate(C) -- (15*\u,1);
\foreach \n in {0,1,...,15}{%%
\pgfmathsetmacro\Color{\n<9 ? "black" : "white"}
\draw[very thick, \Color] ([xshift=\n*\u]C) -- +(0,-3mm) node[below, text=\Color, inner sep=1pt]{
\ifnum\n=0 \else \ifnum\n=1 \n\,cm \else \n \fi\fi}; 
}%%
\foreach \n in {0.1,0.2,...,15}{%% 
\pgfmathsetmacro\Color{\n<9 ? "black" : "white"}
\draw[\Color] ([xshift=\n*\u]C) -- +(0,-1.5mm);
}%%
\end{scope}
\end{tikzpicture}
\end{document}

решение2

В настоящее время я выполняю масштабирование и обрезку с помощью следующего кода:

\documentclass{article}

\usepackage{geometry}
\geometry{paperwidth=10cm, paperheight=10cm, margin=0cm}
\usepackage{graphicx}
\usepackage{pgffor}
\pagenumbering{gobble}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\ScaleImages}{0.6}

\newcommand{\DisplaceHorizontallySetA}{-18cm}
\newcommand{\DisplaceVerticallySetA}{-1.03cm}

\newcommand{\DisplaceHorizontallySetB}{0.5cm}
\newcommand{\DisplaceVerticallySetB}{-4.5cm}

\newcommand{\DisplaceHorizontallySetC}{0.5cm}
\newcommand{\DisplaceVerticallySetC}{-3cm}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\foreach \i in {0,...,0}{ %%%% First picture
    \begin{figure}
    \hspace{\DisplaceHorizontallySetA}
    \vspace{\DisplaceVerticallySetA}\\
    \centerline{    \hspace{\DisplaceHorizontallySetA}
    \includegraphics[scale=\ScaleImages, angle=0.7]{./Pictures/2020-08_Object-1_(51-208North_4-383South)_Picture-\i.jpg}
    }
    \end{figure}
}

\paperwidth=15cm

\foreach \i in {1,...,16}{ %%%% First rotation (picture 1 until 16)
    \begin{figure}
    \hspace{\DisplaceHorizontallySetB}
    \vspace{\DisplaceVerticallySetB}\\
    \centerline{
    \hspace{\DisplaceHorizontallySetB}
    \includegraphics[scale=\ScaleImages]{./Pictures/2020-08_Object-1_(51-208North_4-383South)_Picture-\i.jpg}
}
    \end{figure}
}

\foreach \i in {17,...,32}{ %%%% Second rotation (picture 17 until 32)
    \begin{figure}
    \hspace{\DisplaceHorizontallySetC}
    \vspace{\DisplaceVerticallySetC}\\
    \centerline{
    \hspace{\DisplaceHorizontallySetC}
    \includegraphics[scale=\ScaleImages]{./Pictures/2020-08_Object-1_(51-208North_4-383South)_Picture-\i.jpg}
}
    \end{figure}
}

\end{document}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

В результате получается файл .PDF следующего вида:

введите описание изображения здесь

Затем я использую следующую командную строку терминала, чтобы преобразовать их в .PNG-файлы:

convert -density 400 CropperXYZ.pdf CroppedXYZ.png

Поскольку мы хорошо совместили первое изображение с физической линейкой, теперь мы можем узнать реальный размер квадрата.

Теперь осталась часть для наложения виртуальных линеек.

Связанный контент