【第三课:C++和opencv】图像反转

        图像反转就是黑白颠倒,若像素px= 0,则反转后px=255。公式:反转后的像素a= 255- a。

       主要作用:增强图像的暗区中白色或灰色的细节,特别是黑色面积在尺寸上占主导地位时。

        好了不说了,先上代码:

        PS:代码使用直接访问像素的,直接访问图片的像素有很多种。

// 图像的反转.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat src;
	int height;
	int width;
	
	int i;
	int j;


	//载入图片
	src= imread("F://Opencv_picture//1212.jpg");
	if(!src.data)
	{
	     cout<<"Could not open or find image."<< endl;
		 return -1;
	}
	//获取图像信息
	height= src.rows;                    
	width= src.cols* src.channels();   // 列项要乘通道数

	//创建窗口
	namedWindow("src", CV_WINDOW_AUTOSIZE);
	namedWindow("dst", CV_WINDOW_AUTOSIZE);

    //显示图片
	imshow("src", src);

	//图像反转
	for(i= 0; i< height; i++)
	{
	    for(j=0; j< width; j++)
		{
			src.at<uchar>(i, j)= 255- src.at<uchar>(i, j);   // 每一个像素反转
		}
	}

	//显示图片
	imshow("dst", src);

	waitKey(0);

	return 0;
}

      结果图:


  分析:反转后凸显出病变了的区(黑色部分)

   

PS:

     一:at<uchar>也是在Mat类中定义了的模板

    二: 在检验是否加载了图片时,有两种方法

   (1)if(!image.data)  {   };

     (2)  if(image.empty()) {  }; // empty()是Mat类中定义的模板

       

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat image = imread("image.jpg"); //读取图片 Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY); //灰度化 Mat cornerStrength; cornerHarris(gray, cornerStrength, 3, 3, 0.01); //角点提取 Mat harrisCorners; threshold(cornerStrength, harrisCorners, 0.00001, 255, THRESH_BINARY_INV); //反转黑白 Mat harrisCorners8u; harrisCorners.convertTo(harrisCorners8u, CV_8U); //转换格式 vector<Point2f> corners; goodFeaturesToTrack(harrisCorners8u, corners, 200, 0.01, 10); //检测角点 for (int i = 0; i < corners.size(); i++) { circle(image, corners[i], 5, Scalar(0, 0, 255), 2); } imshow("image", image); waitKey(0); return 0; } ### 回答2: 角点提取是计算机视觉中的一种重要任务,可以用于目标检测、图像拼接等应用。下面是一段使用C语言OpenCV库来实现角点提取的程序。 ```c #include <opencv2/opencv.hpp> int main() { // 读取图像 cv::Mat img = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE); // 定义角点位置 std::vector<cv::Point2f> corners; // 进行角点提取 cv::goodFeaturesToTrack(img, corners, 100, 0.01, 10); // 在图像上绘制角点 for (int i = 0; i < corners.size(); ++i) { cv::circle(img, corners[i], 4, cv::Scalar(0, 255, 0), -1); } // 显示结果图像 cv::imshow("Corners", img); cv::waitKey(0); return 0; } ``` 该程序首先使用`cv::imread`函数读取指定路径下的图像,使用`cv::IMREAD_GRAYSCALE`参数将图像转换为灰度图像。 然后,定义一个`std::vector<cv::Point2f>`类型的变量`corners`用于存储角点的位置。 接下来,使用`cv::goodFeaturesToTrack`函数进行角点提取。该函数需要传入图像、角点容器、最大角点数、角点质量因子和最小角点间距等参数。在这个例子中,我们提取100个角点,设定角点质量因子为0.01,最小角点间距为10。 最后,使用`cv::circle`函数在图像上绘制提取到的角点。 最后,使用`cv::imshow`函数显示绘制好角点的图像,并使用`cv::waitKey`函数等待用户按下按键退出程序。 以上就是用C语言OpenCV库实现角点提取的程序。请注意,为了运行该程序,您需要正确配置OpenCV库和指定正确的图像路径。 ### 回答3: 下面是一个用C语言OpenCV库实现的角点提取算法程序的示例: ```c #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> int main() { cv::Mat image = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE); // 读取输入图像为灰度图 cv::Mat corners; // 存储提取到的角点 cv::goodFeaturesToTrack(image, corners, 100, 0.01, 10); // 使用Good Features to Track算法提取角点 for (int i = 0; i < corners.rows; i++) { cv::Point corner = cv::Point(corners.at<float>(i, 0), corners.at<float>(i, 1)); cv::circle(image, corner, 3, cv::Scalar(255, 0, 0), -1); // 在角点位置画圆 } cv::imshow("Corners", image); // 显示包含角点的图像 cv::waitKey(0); return 0; } ``` 这个程序使用了OpenCV库中的`goodFeaturesToTrack`函数来提取角点。它需要输入一张灰度图像和一些参数,包括最大角点数量、角点质量阈值和最小距离。然后,使用得到的角点坐标在原图上画圆来标记角点位置。 请确保在编译和运行程序之前,您已经正确地安装了OpenCV库,并将图像文件命名为"input.jpg"并与程序文件放在同一个目录下。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值