@@ -828,7 +828,163 @@ <h4>St. Basil's Cathedral with prompt <code>'an oil painting of a snowy mountain
828828</ figure >
829829</ div >
830830</ div >
831+ </ section >
831832
833+ <!-- ========================================================= -->
834+ <!-- Part 1.8: Visual Anagrams -->
835+ <!-- ========================================================= -->
836+ < section id ="part-1-8 ">
837+ < h2 > Part 1.8 – Visual Anagrams</ h2 >
838+
839+ < div class ="subsection ">
840+ < h3 > 1.8.1 – Code: visual_anagrams</ h3 >
841+ < pre > < code > # TODO
842+ # def visual_anagrams(
843+ # prompt_embeds_p1,
844+ # prompt_embeds_p2,
845+ # uncond_prompt_embeds,
846+ # timesteps,
847+ # scale=7,
848+ # num_inference_steps=...,
849+ # ):
850+ # """
851+ # Returns:
852+ # image: torch.Tensor of shape (1, 3, 64, 64) in [-1, 1]
853+ # """
854+ # # TODO</ code > </ pre >
855+
856+ < p class ="note ">
857+ Notes: include your flipping operation (e.g., torch.flip(..., dims=[2])) and how you combine
858+ noise / variance estimates (if applicable).
859+ </ p >
860+ </ div >
861+
862+ < div class ="subsection ">
863+ < h3 > 1.8.2 – Two Visual Anagram Illusions</ h3 >
864+ < p >
865+ Each illusion should look like one concept normally, and another concept when flipped upside down.
866+ Show both orientations.
867+ </ p >
868+
869+ < h4 > Illusion 1</ h4 >
870+ < p > < strong > Prompt p1:</ strong > < em > <!-- TODO: prompt 1 --> </ em > < br />
871+ < strong > Prompt p2:</ strong > < em > <!-- TODO: prompt 2 --> </ em >
872+ </ p >
873+ < div class ="image-row ">
874+ < figure >
875+ < img src ="images/part1_8_illusion1_original.png " alt ="Visual anagram illusion 1 (original) " />
876+ < figcaption > Illusion 1 – Original orientation</ figcaption >
877+ </ figure >
878+ < figure >
879+ < img src ="images/part1_8_illusion1_flipped.png " alt ="Visual anagram illusion 1 (flipped) " />
880+ < figcaption > Illusion 1 – Flipped upside down</ figcaption >
881+ </ figure >
882+ </ div >
883+
884+ < h4 > Illusion 2</ h4 >
885+ < p > < strong > Prompt p1:</ strong > < em > <!-- TODO: prompt 1 --> </ em > < br />
886+ < strong > Prompt p2:</ strong > < em > <!-- TODO: prompt 2 --> </ em >
887+ </ p >
888+ < div class ="image-row ">
889+ < figure >
890+ < img src ="images/part1_8_illusion2_original.png " alt ="Visual anagram illusion 2 (original) " />
891+ < figcaption > Illusion 2 – Original orientation</ figcaption >
892+ </ figure >
893+ < figure >
894+ < img src ="images/part1_8_illusion2_flipped.png " alt ="Visual anagram illusion 2 (flipped) " />
895+ < figcaption > Illusion 2 – Flipped upside down</ figcaption >
896+ </ figure >
897+ </ div >
898+
899+ < p class ="note ">
900+ Brief discussion: what makes the illusion work? How sensitive is it to guidance scale / steps / noise schedule?
901+ <!-- TODO -->
902+ </ p >
903+ </ div >
904+ </ section >
905+
906+ <!-- ========================================================= -->
907+ <!-- Part 1.9: Hybrid Images -->
908+ <!-- ========================================================= -->
909+ < section id ="part-1-9 ">
910+ < h2 > Part 1.9 – Hybrid Images</ h2 >
911+
912+ < div class ="subsection ">
913+ < h3 > 1.9.1 – Code: make_hybrids</ h3 >
914+ < pre > < code > # TODO
915+ # def make_hybrids(
916+ # image_a,
917+ # image_b,
918+ # lowpass_sigma=...,
919+ # highpass_sigma=...,
920+ # blend_weight=...,
921+ # ):
922+ # """
923+ # Returns:
924+ # hybrid: torch.Tensor or np.ndarray (document your format)
925+ # low_freq: low-frequency component (optional)
926+ # high_freq: high-frequency component (optional)
927+ # """
928+ # # TODO</ code > </ pre >
929+
930+ < p class ="note ">
931+ Notes: describe your filter choice (Gaussian blur / FFT), the cutoff frequencies (sigmas),
932+ and how you combined low/high frequency components. <!-- TODO -->
933+ </ p >
934+ </ div >
935+
936+ < div class ="subsection ">
937+ < h3 > 1.9.2 – Two Hybrid Images</ h3 >
938+ < p >
939+ Each hybrid image should look like Image A up close (high frequencies) and Image B from far away
940+ (low frequencies), or vice versa. Include the two source images and the resulting hybrid.
941+ </ p >
942+
943+ < h4 > Hybrid 1</ h4 >
944+ < p >
945+ < strong > Image A (high freq / close):</ strong > < em > <!-- TODO: describe A --> </ em > < br />
946+ < strong > Image B (low freq / far):</ strong > < em > <!-- TODO: describe B --> </ em >
947+ </ p >
948+ < div class ="image-row ">
949+ < figure >
950+ < img src ="images/part1_9_hybrid1_sourceA.png " alt ="Hybrid 1 source A " />
951+ < figcaption > Hybrid 1 – Source A</ figcaption >
952+ </ figure >
953+ < figure >
954+ < img src ="images/part1_9_hybrid1_sourceB.png " alt ="Hybrid 1 source B " />
955+ < figcaption > Hybrid 1 – Source B</ figcaption >
956+ </ figure >
957+ < figure >
958+ < img src ="images/part1_9_hybrid1_result.png " alt ="Hybrid 1 result " />
959+ < figcaption > Hybrid 1 – Result</ figcaption >
960+ </ figure >
961+ </ div >
962+
963+ < h4 > Hybrid 2</ h4 >
964+ < p >
965+ < strong > Image A (high freq / close):</ strong > < em > <!-- TODO: describe A --> </ em > < br />
966+ < strong > Image B (low freq / far):</ strong > < em > <!-- TODO: describe B --> </ em >
967+ </ p >
968+ < div class ="image-row ">
969+ < figure >
970+ < img src ="images/part1_9_hybrid2_sourceA.png " alt ="Hybrid 2 source A " />
971+ < figcaption > Hybrid 2 – Source A</ figcaption >
972+ </ figure >
973+ < figure >
974+ < img src ="images/part1_9_hybrid2_sourceB.png " alt ="Hybrid 2 source B " />
975+ < figcaption > Hybrid 2 – Source B</ figcaption >
976+ </ figure >
977+ < figure >
978+ < img src ="images/part1_9_hybrid2_result.png " alt ="Hybrid 2 result " />
979+ < figcaption > Hybrid 2 – Result</ figcaption >
980+ </ figure >
981+ </ div >
982+
983+ < p class ="note ">
984+ Optional: include frequency visualizations or intermediate components (low/high pass) if you computed them.
985+ <!-- TODO -->
986+ </ p >
987+ </ div >
832988</ section >
833989
834990</ body >
0 commit comments