武理惠海视觉培训周记(一)

1、opencv安装

参考以下文章:

https://blog.csdn.net/m0_71341589/article/details/131563319

2、数字图像的概念和种类

2.1数字图像是什么

数字图像是在计算机上显示和处理的图像,可分为位图(BMP、JPG、GIF)和矢量图(PNG)两种,位图是由图像中每个像素的幅值(灰度、亮度和强度)组成的,我们一般都是在位图上进行处理。

2.2数字图像的分类

根据不同数字图像所包含的信息不同,可分为二值图像、灰度图像、RGB图像和索引图像等。

二值图像:每个像素只有黑、白两种颜色,取0代表黑色,1代表白色。

灰度图像:每个像素取黑色到白色之间的颜色深度,从0到255,共256种取值。

RGB图像:每个像素由红绿蓝三原色组成,每种颜色也是取0到255的颜色深度。

索引图像:当图像颜色种类比较少时,可采用颜色表(16*3的二维数组),选取基准颜色,再查询对应颜色表中的索引(偏移量)。

源自以下文章:

https://blog.csdn.net/qq_37249793/article/details/114027318?

3、opencv读取并显示图像

#include<opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat img; 			       //定义一个Mat变量存储图像
    img = imread("E:\opencv\opencv1\picture\test01.jpg");          //读取图片,图片路径记得改一下

    imshow("test", img); 				  //显示图片
    waitKey(0);							  //窗口等待
}

如出现以下报错:
![在这里插入图片描述](https://img-blog.csdnimg.cn/37b21d1d926f417e98ce33bd358fbbf7.png
则将路径改为:

E:\\opencv\\opencv1\\picture\\test01.jpg

原因是C++会把一个\默认为转义符号。

4、ROI感兴趣区域

通过Rect rect()设置一个正方形区域
Rect rect(40, 70, 300, 200);
从图片左上角开始,向右40个像素点,再向下70个像素点
以这个点为矩形的左上角截取一个300×200的矩形

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat img = imread("E:\\opencv\\opencv1\\picture\\test01.jpg");
    Mat dest;
    resize(img, dest, Size(), 0.5, 0.5);

    Rect rect(40, 70, 300, 200);
    Mat roi = dest(rect);

    namedWindow("dest");
    namedWindow("roi");
    moveWindow("dest", 0, 0);
    moveWindow("roi", 250, 0);
    imshow("dest", dest);
    imshow("roi", roi);

    waitKey(0);
    return 0;
}

5、cvtcolor

函数cvtcolor()的原型如下:

void cv::cvtColor(InputArray src,OutputArray dst,int code,int dstCn = 0)

cv2.cvtcolor函数是OpenCV中的一个函数,用于将图像从一种颜色空间转换为另一种颜色空间。它可以将图像从BGR颜色空间转换为灰度图像、HSV颜色空间、YCrCb颜色空间等。该函数的语法为cv2.cvtColor(src, code)。其中,src是输入图像,code是转换的颜色空间代码。

以下是RGB图像转化为HSV图像:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
    Mat imgrgb = imread("E:\\opencv\\opencv1\\picture\\test01.jpg");//读取图片,定义Mat类型,不设置imread的第二个参数默认读入彩色图片
        Mat imghsv;//定义目标图像

    cvtColor(imgrgb, imghsv, COLOR_BGR2HSV);//将imgrgb转换为HSV图像保存在imghsv中

        imshow("HSV", imghsv); 				  //显示图片
        waitKey(0);							  //窗口等待
    
}

参考链接如下:

https://blog.csdn.net/m0_75161026/article/details/128166262?

https://blog.csdn.net/weixin_44378835/article/details/124841699?

灰度化参考链接如下:

https://blog.csdn.net/qq_36853469/article/details/106416128?

6、resiz图像

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
int main()
{
    Mat img = imread("E:\\opencv\\opencv1\\picture\\test01.jpg", 1);
    //缩放
    double scale = 0.5;
    Size dsize = Size(img.cols * scale, img.rows * scale);
    Mat img2 = Mat(dsize, CV_32S);
    resize(img, img2, dsize);
    imshow("img", img);
    imshow("img2", img2);
    waitKey(0);
    return 0;
    //或者来直接的
    //Mat img = imread("1.jpg", 1);
    //Mat img2;
    //resize(img,img2,Size(img.cols*scale,img.rows*scale));   //缩小为1/2
    //resize(img, img2, Size(20, 20));    //缩放到任意尺寸,20*20
}

参考链接如下:

https://blog.csdn.net/u012308586/article/details/100734249?

7、访问像素

7.1什么是访问像素

访问像素是在图像处理和计算机视觉应用中非常重要的操作之一。通过访问像素,可以获取图像中每个像素的值,并根据需要进行操作、分析或修改。

下面是一些访问像素的常见用途:

  1. 图像处理:可以通过访问像素来实施各种图像处理操作,例如滤波、增强对比度、调整亮度、锐化图像等。通过修改像素值,可以改变图像的外观或提取感兴趣的特征。

  2. 特征提取:通过访问像素,可以计算图像的各种特征,如颜色直方图、纹理特征、边缘检测等。这些特征对于图像分类、对象识别和图像检索等任务非常有用。

  3. 目标检测与跟踪:在目标检测和跟踪任务中,可以访问图像像素来分析图像中的目标区域。通过检测特定像素值或使用图像分割算法,可以定位感兴趣的目标并跟踪它们的运动。

  4. 图像分割:通过访问像素并使用聚类或分割算法,可以将图像分割为不同的区域或对象。这对于图像分析、图像编辑和计算机辅助诊断等应用非常有用。

  5. 图像编码与压缩:在图像编码和压缩算法中,访问像素是必不可少的。通过对像素值进行编码或应用压缩算法,可以减小图像文件的大小并实现高效的存储和传输。

代码如下:

#include <opencv2/opencv.hpp>

int main()
{
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");

    // 检查图像是否成功读取
    if (image.empty())
    {
        std::cout << "无法读取图像文件" << std::endl;
        return 1;
    }

    // 获取图像的宽度和高度
    int width = image.cols;
    int height = image.rows;

    // 访问像素
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            // 访问像素点 (x, y)
            cv::Vec3b pixel = image.at<cv::Vec3b>(y, x);

            // 读取或修改像素值
            unsigned char blue = pixel[0];
            unsigned char green = pixel[1];
            unsigned char red = pixel[2];

            // 修改像素值示例:将像素点设置为纯蓝色
            pixel[0] = 255;  // 蓝色通道
            pixel[1] = 0;    // 绿色通道
            pixel[2] = 0;    // 红色通道

            // 将修改后的像素值写回图像
            image.at<cv::Vec3b>(y, x) = pixel;
        }
    }

    // 显示修改后的图像
    cv::imshow("Modified Image", image);
    cv::waitKey(0);

    return 0;
}

在此示例中,我们首先使用cv::imread函数读取图像,然后通过检查image是否为空来确认图像是否成功读取。然后,我们获取图像的宽度和高度,并使用嵌套的for循环遍历所有像素。

通过使用image.atcv::Vec3b(y, x),我们可以获取像素(x, y)处的像素值。在这个示例中,我们假设图像是三通道的(BGR顺序),因此我们使用cv::Vec3b表示每个像素,其中每个通道的值可以通过pixel[0]、pixel[1]和pixel[2]来访问。

您可以根据需要读取或修改像素值。在这个示例中,我们展示了如何将像素点设置为纯蓝色。

最后,我们使用cv::imshow和cv::waitKey显示修改后的图像,并在按下任意键时退出程序。

7.2通过访问像素处理一张图片实现图像锐化

以下代码并未直接访问像素,因为锐化操作涉及卷积运算,该运算需要对图像的每个像素进行访问和处理。锐化卷积核的每个系数都会影响周围像素的值,从而改变像素的亮度和对比度,以增强图像的边缘和细节。

因此,尽管示例代码中没有直接的像素访问,但卷积运算涉及访问和处理每个像素的值。

#include <opencv2/opencv.hpp>

int main()
{
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");

    // 检查图像是否成功读取
    if (image.empty())
    {
        std::cout << "无法读取图像文件" << std::endl;
        return 1;
    }

    // 创建锐化卷积核
    cv::Mat kernel = (cv::Mat_<float>(3, 3) <<
        0, -1, 0,
        -1, 5, -1,
        0, -1, 0);

    // 进行卷积操作
    cv::Mat sharpened;
    cv::filter2D(image, sharpened, -1, kernel);

    // 显示原始图像和锐化后的图像
    cv::imshow("Original Image", image);
    cv::imshow("Sharpened Image", sharpened);
    cv::waitKey(0);

    return 0;
}

以下是通过访问所有像素以及拉普拉斯滤波器实现的图像锐化:

#include <opencv2/opencv.hpp>

int main()
{
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");

    // 检查图像是否成功读取
    if (image.empty())
    {
        std::cout << "无法读取图像文件" << std::endl;
        return 1;
    }

    // 创建锐化滤波器(拉普拉斯滤波器)
    cv::Mat sharpeningFilter = (cv::Mat_<float>(3, 3) <<
        0, -1, 0,
        -1, 5, -1,
        0, -1, 0);

    // 创建结果图像
    cv::Mat sharpened = cv::Mat::zeros(image.size(), image.type());

    // 遍历图像的每个像素
    for (int y = 1; y < image.rows - 1; ++y)
    {
        for (int x = 1; x < image.cols - 1; ++x)
        {
            cv::Vec3f sum = cv::Vec3f(0, 0, 0);

            // 对滤波器区域内的像素进行操作
            for (int j = -1; j <= 1; ++j)
            {
                for (int i = -1; i <= 1; ++i)
                {
                    cv::Vec3b pixel = image.at<cv::Vec3b>(y + j, x + i);
                    cv::Vec3f value = cv::Vec3f(pixel[0], pixel[1], pixel[2]);
                    sum += value * sharpeningFilter.at<float>(j + 1, i + 1);
                }
            }

            // 将结果存入结果图像
            sharpened.at<cv::Vec3b>(y, x) = cv::Vec3b(
                cv::saturate_cast<uchar>(sum[0]),
                cv::saturate_cast<uchar>(sum[1]),
                cv::saturate_cast<uchar>(sum[2])
            );
        }
    }

    // 显示原始图像和锐化后的图像
    cv::imshow("Original Image", image);
    cv::imshow("Sharpened Image", sharpened);
    cv::waitKey(0);

    return 0;
}

效果图如下所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S_HHHHHH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值