【AI绘画】Midjourney进阶:对称构图详解 https://blog.csdn.net/2201_75539691?type=blog
【AI绘画】Midjourney进阶:三分线构图详解 https://blog.csdn.net/2201_75539691?type=blog
【AI绘画】Midjourney进阶:中心点构图详解 https://blog.csdn.net/2201_75539691?type=blog
【AI绘画】Midjourney进阶:留白构图详解 https://blog.csdn.net/2201_75539691?type=blog
构图是摄影、绘画、设计等视觉艺术中的一个基本概念。它指的是艺术家如何在二维平面上安排元素,包括形状、线条、色彩、质地、空间等,以达到一定的视觉效果和艺术表达。
引导线构图是一种常用技巧,它利用图像中的线条引导观者的视线,将注意力引向图片的主要焦点或者让眼睛在画面中流动。
Guide Line Composition
)这一关键词非常关键。这一构图技巧通过线条的排列与设计,引导观众的视线沿着特定路径在画面中流动,最终聚焦在图像的重点区域。在提示词中加入guide Line Composition
,能够帮助AI生成的图像更好地体现视觉引导效果,强化画面的层次感和空间感。这一技巧广泛应用于风景、建筑以及人像摄影等领域,使生成的图像更具深度和视觉连贯性。
原图:
landscape photography, mountains, valley, river, sunset, soft lighting, 8k, cinematic, wide angle --ar 16:9
原图+guide Line Composition:
landscape photography, mountains, winding road, river, sunset, guide line composition, leading lines, cinematic, 8k, dramatic lighting, wide angle --ar 16:9
guide line composition
后大大增强了视觉引导效果。通过蜿蜒的道路和河流作为引导线,观众的视线会自然地从画面前景延伸至远处,画面中的线条结构强化了纵深感,使得图像看起来更加有序和立体。同时,观众的目光被有效地引导至远方的风景,使得画面的层次更加分明,整体的视觉体验更具连贯性和冲击力。
引导线构图作为一种重要的视觉表现手法,在Midjourney生成图像的过程中,能够显著提升画面的视觉效果和层次感。通过合理运用线条,将观众的视线自然而然地引向图像的主要焦点,不仅可以强化画面中的视觉重点,还能够创造出一种流动感,使图像看起来更加生动、有深度。在风景、建筑和人像摄影等场景中,引导线构图的运用都能帮助创作者实现更具吸引力的作品。这种构图技巧,结合了美学与技术,能够有效增强图像的视觉连贯性和表现力,尤其在使用Midjourney进行AI生成图像时,通过在提示词中添加相关的构图词汇,作品的质量和层次感可以得到显著提升。
import torch, torchvision.transforms as transforms; from torchvision.models import vgg19; import torch.nn.functional as F; from PIL import Image; import matplotlib.pyplot as plt; class StyleTransferModel(torch.nn.Module): def __init__(self): super(StyleTransferModel, self).__init__(); self.vgg = vgg19(pretrained=True).features; for param in self.vgg.parameters(): param.requires_grad_(False); def forward(self, x): layers = {'0': 'conv1_1', '5': 'conv2_1', '10': 'conv3_1', '19': 'conv4_1', '21': 'conv4_2', '28': 'conv5_1'}; features = {}; for name, layer in self.vgg._modules.items(): x = layer(x); if name in layers: features[layers[name]] = x; return features; def load_image(img_path, max_size=400, shape=None): image = Image.open(img_path).convert('RGB'); if max(image.size) > max_size: size = max_size; else: size = max(image.size); if shape is not None: size = shape; in_transform = transforms.Compose([transforms.Resize((size, size)), transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))]); image = in_transform(image)[:3, :, :].unsqueeze(0); return image; def im_convert(tensor): image = tensor.to('cpu').clone().detach(); image = image.numpy().squeeze(); image = image.transpose(1, 2, 0); image = image * (0.229, 0.224, 0.225) + (0.485, 0.456, 0.406); image = image.clip(0, 1); return image; def gram_matrix(tensor): _, d, h, w = tensor.size(); tensor = tensor.view(d, h * w); gram = torch.mm(tensor, tensor.t()); return gram; content = load_image('content.jpg').to('cuda'); style = load_image('style.jpg', shape=content.shape[-2:]).to('cuda'); model = StyleTransferModel().to('cuda'); style_features = model(style); content_features = model(content); style_grams = {layer: gram_matrix(style_features[layer]) for layer in style_features}; target = content.clone().requires_grad_(True).to('cuda'); style_weights = {'conv1_1': 1.0, 'conv2_1': 0.8, 'conv3_1': 0.5, 'conv4_1': 0.3, 'conv5_1': 0.1}; content_weight = 1e4; style_weight = 1e2; optimizer = torch.optim.Adam([target], lr=0.003); for i in range(1, 3001): target_features = model(target); content_loss = F.mse_loss(target_features['conv4_2'], content_features['conv4_2']); style_loss = 0; for layer in style_weights: target_feature = target_features[layer]; target_gram = gram_matrix(target_feature); style_gram = style_grams[layer]; layer_style_loss = style_weights[layer] * F.mse_loss(target_gram, style_gram); b, c, h, w = target_feature.shape; style_loss += layer_style_loss / (c * h * w); total_loss = content_weight * content_loss + style_weight * style_loss; optimizer.zero_grad(); total_loss.backward(); optimizer.step(); if i % 500 == 0: print('Iteration {}, Total loss: {}'.format(i, total_loss.item())); plt.imshow(im_convert(target)); plt.axis('off'); plt.show()