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

格式塔心理学的应用
①闭合原则:人类视觉会自动填补不完整图形的缺口,将碎片信息感知为整体(如三个带缺口的圆被感知为三角形)。
②完形倾向:视觉倾向于将共线或对称的片段连接为连续轮廓(如缺口的边缘暗示三角形边线)。
③对称性与简化:大脑偏好简单、对称的解释(正三角形分布强化虚拟轮廓的感知)。
实验环境
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)
| 心理学原则 | 算法实现对应 |
|---|---|
| 闭合原则 | 虚拟边连接缺口边缘的交点 |
| 完形倾向 | 切线方向一致性验证 |
| 对称性偏好 | 等边三角形模板匹配 |
浙公网安备 33010602011771号