模式识别与图像处理课程实验一:图像处理实验(颜色算子实验、Susan、Harris角点检测实验、 sobel边缘算子检测实验)

简介: 模式识别与图像处理课程实验一:图像处理实验(颜色算子实验、Susan、Harris角点检测实验、 sobel边缘算子检测实验)

b2ed160030774f17ba29b4ac10a0c0e9.jpg



一、 实验内容


要求编写一个包含颜色算子,Susan,Harris,角点,sobel边缘算子的程。


二、 颜色算子实验


2.1、 提取红色


  • 实验的程序如下


import numpy as np
import cv2 as cv
image = cv.imread("1.jpg")
image = image / np.ones([1, 1, 3]).astype(np.float32)
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
print(image.shape)
# 颜色算子
# red
redAdd = np.ones([1, 1, 3]).astype(np.float32)
redAdd[0, 0, 0] = 1.0
redAdd[0, 0, 1] = 0.5
redAdd[0, 0, 2] = 0.25
redSub = np.ones([1, 1, 3]).astype(np.float32)
redSub[0, 0, 0] = 0.25
redSub[0, 0, 1] = 0.5
redSub[0, 0, 2] = 1.0
image1 = np.mean(image * redAdd, 2)
image2 = np.mean(image * redSub, 2) + 100
imageRed = image1 / image2
redMax = np.max(imageRed)
redMin = np.min(imageRed)
imageRed = 255 * (imageRed - redMin) / (redMax - redMin)
cv.imwrite("1red.png", imageRed)

运行结果如下

  1. 实验原图


76ac7ff6a83c4098a07978445be204e1.jpg

实验结果图



3b1192ca27104fce91e8f0fa6ec3f74e.png

2.2、 提取绿色


实验的程序如下


import numpy as np
import cv2 as cv
image = cv.imread("1.jpg")
image = image / np.ones([1, 1, 3]).astype(np.float32)
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
print(image.shape)
# green
greenAdd = np.ones([1, 1, 3]).astype(np.float32)
greenAdd[0, 0, 0] = 0.5
greenAdd[0, 0, 1] = 1.0
greenAdd[0, 0, 2] = 0.25
greenSub = np.ones([1, 1, 3]).astype(np.float32)
greenSub[0, 0, 0] = 0.5
greenSub[0, 0, 1] = 0.25
greenSub[0, 0, 2] = 1.0
image1 = np.mean(image * greenAdd, 2)
image2 = np.mean(image * greenSub, 2) + 100
imageGreen = image1 / image2
greenMax = np.max(imageGreen)
greenMin = np.min(imageGreen)
imageRed = 255 * (imageGreen - greenMin) / (greenMax - greenMin)
cv.imwrite("1green.png", imageRed)

运行结果如下

  1. 实验原图



d5158459b26b457eac2932b875f010d5.jpg


实验结果图


fbe70b60b42a47299719abc411cae334.png


2.3、 提取蓝色

  • 实验的程序如下
import numpy as np
import cv2 as cv
image = cv.imread("1.jpg")
image = image / np.ones([1, 1, 3]).astype(np.float32)
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
print(image.shape)
# bule
buleAdd = np.ones([1, 1, 3]).astype(np.float32)
buleAdd[0, 0, 0] = 0.25
buleAdd[0, 0, 1] = 0.5
buleAdd[0, 0, 2] = 1.0
buleSub = np.ones([1, 1, 3]).astype(np.float32)
buleSub[0, 0, 0] = 1.0
buleSub[0, 0, 1] = 0.5
buleSub[0, 0, 2] = 0.25
image1 = np.mean(image * buleAdd, 2)
image2 = np.mean(image * buleSub, 2) + 100
imageBlue = image1 / image2
blueMax = np.max(imageBlue)
blueMin = np.min(imageBlue)
imageBlue = 255 * (imageBlue - blueMin) / (blueMax - blueMin)
cv.imwrite("1blue.png", imageBlue)


运行结果如下

  1. 实验原图



064bfc631a6140a49cf36af789954411.jpg



  1. 实验结果图



image.png


三、 Susan、Harris角点检测实验


3. 1、 实验程序


3.1.1、Susan角点检测


Susan角点检测程序如下

import numpy as np
import cv2 as cv
image = cv.imread("2.jpg")
image = np.mean(image, 2)
height = image.shape[0]
width = image.shape[1]
print(image.shape)
#susan 算子
radius = 5
imageSusan = np.zeros([height, width]).astype(np.float32)
for h in range(radius, height-radius):
    for w in range(radius, width-radius):
        numSmall = 0
        numLarge = 0
        numAll = 0
        for y in range(-radius, radius + 1):
            for x in range(-radius, radius+1):
                distance = np.sqrt(y**2 + x**2)
                if distance <= radius:
                    numAll += 1
                    if image[h + y, w + x] < image[h, w] - 27:
                        numSmall += 1
                    if image[h + y, w + x] > image[h, w] + 27:
                        numLarge += 1
        ratio = 1.0 * numSmall / numAll
        ratio2 = 1.0 * numLarge / numAll
        if ratio < 0.3:
            imageSusan[h, w] = 0.3 - ratio
        if ratio2 > 0.7:
            imageSusan[h, w] = ratio2 - 0.7
imageMax = np.max(imageSusan)
imageMin = np.min(imageSusan)
imageSusan = 255*(imageSusan - imageMin)/(imageMax - imageMin)
print(imageSusan.shape)
cv.imwrite("2.png", imageSusan)


  • 运行结果如下
  1. 实验原图


2054f35aa53342eba2fb0eb9b9d3c5e6.jpg


实验结果图



ab8996af593e4bf5bc3eadf04f798686.png


3.1.2、Harris角点检测


  • Harris角点检测程序如下


import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv.imread('3.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 图像转换成灰度图像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
grayImage = np.float32(grayImage)
# Harris算子
harrisImage = cv.cornerHarris(grayImage, 2, 3, 0.04)
harrisImage = cv.dilate(harrisImage, None)
# 设置阈值
thresImage = 0.006 * harrisImage.max()
img[harrisImage > thresImage] = [255, 0, 0]
# 显示正常中文的标签
plt.rcParams['font.sans-serif'] = ['SimHei']
titles = [u'(a)原始图像', u'(b)Harris图像']
images = [lenna_img, img]
for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

运行结果如下


a9c14dd483e546cfa693a8fdd3503b22.png


四、 sobel边缘算子检测实验


4.1、sobel边缘算子检


  • sobel边缘算子检程序如下


import numpy as np
import cv2
image = cv2.imread("3.jpg")
height = image.shape[0]
width = image.shape[1]
sobelResult = np.zeros([height - 2, width - 2, 1]).astype(np.float32)
sobelX = np.zeros([3, 3, 1]).astype(np.float32)
sobelY = np.zeros([3, 3, 1]).astype(np.float32)
sobelX[0, 0, 0] = -1
sobelX[1, 0, 0] = -2
sobelX[2, 0, 0] = -1
sobelX[0, 2, 0] = 1
sobelX[1, 2, 0] = 2
sobelX[2, 2, 0] = 1
sobelY[0, 0, 0] = -1
sobelY[0, 1, 0] = -2
sobelY[0, 2, 0] = -1
sobelY[2, 0, 0] = 1
sobelY[2, 1, 0] = 2
sobelY[2, 2, 0] = 1
for h in range(0, height - 3):
    for w in range(0, width - 3):
        #求方向梯度
        imageIncre = image[h:h + 3, w:w + 3]
        gradientX = np.sum(imageIncre * sobelX)
        gradientY = np.sum(imageIncre * sobelY)
        gradient = np.sqrt(gradientX**2 + gradientY**2)
        sobelResult[h, w, 0] = gradient
imageMax = np.max(sobelResult)
imageMin = np.min(sobelResult)
sobelResult = 255*(sobelResult - imageMin) / (imageMax - imageMin)
cv2.imwrite("3.png", sobelResult)

2、 运行结果如下

  1. 实验原图



d042f13f24374fc6ae82eb2bf16b6b97.jpg


实验结果图

dbb6f2dc095c454eb454bc029fdb28a0.png


五、 实验总结


  • 1、 掌握了编写含颜色算子图像处理、Susan与Harris角点图像检测、sobel边缘算子图像检测的程序编写方法。
  • 2、 通过实验、对于边缘检测算子与角点检测算子有了进一步的掌握。


39505552313e4993965180cc898444f7.jpg

相关文章
|
资源调度 算法 计算机视觉
数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
658 0
数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
|
2天前
|
算法 计算机视觉
OpenCV中使用加速鲁棒特征检测SURF与图像降噪讲解与实战(附源码)
OpenCV中使用加速鲁棒特征检测SURF与图像降噪讲解与实战(附源码)
41 0
|
5月前
|
机器学习/深度学习 算法 数据库
基于HOG特征提取和GRNN神经网络的人脸表情识别算法matlab仿真,测试使用JAFFE表情数据库
基于HOG特征提取和GRNN神经网络的人脸表情识别算法matlab仿真,测试使用JAFFE表情数据库
|
10月前
|
算法 计算机视觉 Python
计算机视觉实验:边缘提取与特征检测
计算机视觉实验:边缘提取与特征检测
|
算法 计算机视觉
数字图像处理OpenCV——实验三 图像分割实验
实验三 图像分割实验 实验项目名称:图像分割实验 (1) 进一步理解图像的阈值分割方法和边缘检测方法的原理。 (2) 掌握图像基本全局阈值方法和最大类间方差法(otsu法)的原理并编程实现。 (3) 编程实现图像的边缘检测。 编程实现图像阈值分割(基本全局阈值方法和otsu法)和边缘检测。 图像的二值化处理图像分割中的一个主要内容,就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。用I表示原图,R表示二值化后的图,则二值化的过程可以用以下公式表示: thr表示选取的阈值。二值化的过
317 0
数字图像处理OpenCV——实验三 图像分割实验
|
12月前
|
算法 数据库
m基于HOG特征提取和GRNN网络的人体姿态识别算法matlab仿真,样本为TOF数据库的RGB-D深度图像
m基于HOG特征提取和GRNN网络的人体姿态识别算法matlab仿真,样本为TOF数据库的RGB-D深度图像
221 0
|
12月前
|
机器学习/深度学习 传感器 算法
数字图像分割与边缘检测实验附matlab代码
数字图像分割与边缘检测实验附matlab代码
数字图像分割与边缘检测实验附matlab代码
|
机器学习/深度学习 算法
m基于图像灰度共生矩阵纹理提取和GRNN神经网络的人口密度检测算法matlab仿真
m基于图像灰度共生矩阵纹理提取和GRNN神经网络的人口密度检测算法matlab仿真
107 0
|
算法 BI
m基于HOG特征提取和GA优化GRNN网络的交通标志检测和识别算法matlab仿真
m基于HOG特征提取和GA优化GRNN网络的交通标志检测和识别算法matlab仿真
129 0
|
编解码 计算机视觉
MATLAB--数字图像处理 图像的采样与量化
MATLAB--数字图像处理 图像的采样与量化
365 0
MATLAB--数字图像处理 图像的采样与量化