利用格式塔心理学识别“三角形”

实验要求

结合格式塔心理学原理,设计算法,识别下图中的“三角形”。

格式塔心理学的应用

①闭合原则:人类视觉会自动填补不完整图形的缺口,将碎片信息感知为整体(如三个带缺口的圆被感知为三角形)。

②完形倾向:视觉倾向于将共线或对称的片段连接为连续轮廓(如缺口的边缘暗示三角形边线)。

③对称性与简化:大脑偏好简单、对称的解释(正三角形分布强化虚拟轮廓的感知)。

实验环境

OpenCV(图像处理)

NumPy(数值计算)

Matplotlib(图像展示)

算法设计

图像预处理

将图像转为灰度并进行高斯模糊,去除噪声。

应用 Canny 边缘检测,提取轮廓信息。

寻找轮廓并识别图形

提取图像中所有外部轮廓。

遍历轮廓,对每个形状进行分析,判断其是否为近似的“带缺口圆形”

使用圆度(Circularity)筛选出可能是“Pac-Man”图形的部分,排除普通圆与非圆。

拟合主观三角形

若检测到三个近似“Pac-Man”图形,则提取其中心坐标。

将三个中心点连接,构成主观三角形的边缘。

Demo

完整代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

def detect_kanizsa_triangle(image_path):
    # 读取图像
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 预处理
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    edges = cv2.Canny(blurred, 50, 150)

    # 查找轮廓
    contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 存储可能的“Pac-Man”圆形中心
    candidates = []

    for cnt in contours:
        approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
        area = cv2.contourArea(cnt)
        if area < 100:  # 过滤掉太小的轮廓
            continue

        # 拟合最小外接圆
        (x, y), radius = cv2.minEnclosingCircle(cnt)
        center = (int(x), int(y))
        
        # 圆度计算(用于判断是否接近圆形)
        perimeter = cv2.arcLength(cnt, True)
        circularity = 4 * np.pi * area / (perimeter ** 2 + 1e-5)

        if 0.5 < circularity < 0.95:  # 接近圆但不完全圆,可能有缺口
            candidates.append(center)
            cv2.circle(img, center, int(radius), (0, 255, 0), 2)

    # 判断是否检测到了三角形
    triangle_detected = False
    if len(candidates) == 3:
        pts = np.array(candidates, np.int32)
        pts = pts.reshape((-1, 1, 2))
        cv2.polylines(img, [pts], isClosed=True, color=(255, 0, 0), thickness=2)
        triangle_detected = True

    # 显示结果图像
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.figure(figsize=(6, 6))
    plt.imshow(img_rgb)
    plt.title("Detected Triangle" if triangle_detected else "No Triangle Detected")
    plt.axis("off")
    plt.show()

# 替换成你本地的图像路径
image_path = "kanizsa_triangle.png"
detect_kanizsa_triangle(image_path)
心理学原则 算法实现对应
闭合原则 虚拟边连接缺口边缘的交点
完形倾向 切线方向一致性验证
对称性偏好 等边三角形模板匹配
posted on 2025-04-17 17:37  Mayne  阅读(64)  评论(0)    收藏  举报