1、基于像素值的方法
遍历每个像素,检查它的RGB(或灰度)值是否与目标点的RGB(或灰度)值相同。如果相同,则将该像素的坐标记录下来。
代码如下,
from PIL import Image
img = Image.open('image.jpg')
width, height = img.size
# 目标点的RGB值
red = (255, 0, 0)
green = (0, 255, 0)
# 遍历每个像素,检查它的RGB值是否与目标点的RGB值相同
red_points = []
green_points = []
for y in range(height):
for x in range(width):
pixel = img.getpixel((x, y))
if pixel == red:
red_points.append((x, y))
elif pixel == green:
green_points.append((x, y))
print('Red points:', red_points)
print('Green points:', green_points)
2、基于边缘检测的方法
使用Canny等边缘检测算法,在图像中找到边缘,并在边缘上寻找像素值满足条件的点。
代码如下,
import cv2
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
# 目标点的颜色值
red = (0, 0, 255)
green = (0, 255, 0)
# 在边缘上寻找满足条件的点
red_points = []
green_points = []
for y in range(edges.shape[0]):
for x in range(edges.shape[1]):
if tuple(img[y][x]) == red and edges[y][x] != 0:
red_points.append((x, y))
elif tuple(img[y][x]) == green and edges[y][x] != 0:
green_points.append((x, y))
print('Red points:', red_points)
print('Green points:', green_points)
3、基于模板匹配的方法
使用Opencv库中模板匹配函数matchTemplate
,将目标点当作模板,在图像中匹配出所有符合模板的位置。
代码如下,
import cv2
img = cv2.imread('image.jpg')
temp_red = cv2.imread('red.jpg')
temp_green = cv2.imread('green.jpg')
# 使用模板匹配函数,找到符合条件的位置
res_red = cv2.matchTemplate(img, temp_red, cv2.TM_CCORR_NORMED)
res_green = cv2.matchTemplate(img, temp_green, cv2.TM_CCORR_NORMED)
threshold = 0.8
loc_red = np.where(res_red >= threshold)
loc_green = np.where(res_green >= threshold)
red_points = list(zip(*loc_red[::-1]))
green_points = list(zip(*loc_green[::-1]))
print('Red points:', red_points)
print('Green points:', green_points)
4、基于特征提取的方法
使用Opencv库中的SURF、SIFT等特征提取算法,提取图像中的关键点,并比对这些关键点与目标点的特征向量,从而得到目标点的位置。
代码如下,
import cv2
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
surf = cv2.xfeatures2d.SURF_create(400)
kp, des = surf.detectAndCompute(gray, None)
# 目标点的颜色值
red = (0, 0, 255)
green = (0, 255, 0)
# 比对关键点与目标点的特征向量,得到目标点的位置
matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_FLANNBASED)
for i in range(len(kp)):
if tuple(img[int(kp[i].pt[1])][int(kp[i].pt[0])]) == red:
matches = matcher.match(des[i], des_red)
if len(matches) > 0:
print('Red point:', kp[i].pt)
elif tuple(img[int(kp[i].pt[1])][int(kp[i].pt[0])]) == green:
matches = matcher.match(des[i], des_green)
if len(matches) > 0:
print('Green point:', kp[i].pt)
5、实现JPG图像中特殊点的识别实例
已有一张jpg格式黑白图片,其中特殊点分别用红色、绿色、蓝色三种颜色标出,并输出三种颜色的坐标。
代码如下,
import cv2
# 读取图像并转换为灰度图像
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 分离红色、绿色、蓝色部分
lower_red = (0, 0, 200)
upper_red = (50, 50, 255)
red_mask = cv2.inRange(img, lower_red, upper_red)
lower_green = (0, 150, 0)
upper_green = (50, 255, 50)
green_mask = cv2.inRange(img, lower_green, upper_green)
lower_blue = (200, 0, 0)
upper_blue = (255, 50, 50)
blue_mask = cv2.inRange(img, lower_blue, upper_blue)
# 找到各个颜色部分的轮廓并绘制在原图上
contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
contours, _ = cv2.findContours(green_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
contours, _ = cv2.findContours(blue_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (255, 0, 0), 3)
# 计算每种颜色部分的质心坐标并输出结果
moments_red = cv2.moments(red_mask)
cx_red = int(moments_red['m10'] / moments_red['m00'])
cy_red = int(moments_red['m01'] / moments_red['m00'])
print('Red dot:', cx_red, cy_red)
moments_green = cv2.moments(green_mask)
cx_green = int(moments_green['m10'] / moments_green['m00'])
cy_green = int(moments_green['m01'] / moments_green['m00'])
print('Green dot:', cx_green, cy_green)
moments_blue = cv2.moments(blue_mask)
cx_blue = int(moments_blue['m10'] / moments_blue['m00'])
cy_blue = int(moments_blue['m01'] / moments_blue['m00'])
print('Blue dot:', cx_blue, cy_blue)
# 显示结果图像
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()