opecv进行简单的进行图片分割1

opencv入门程序 --冈萨雷斯书上的作业--要求分割图片

#include<opencv2/highgui/highgui.hpp>

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat srcImage, dstImage1, dstImage2, dstImage3;
int g_nAdaptiveMethod = 0;
int g_nBlocksize = 1;
int g_nBinary = 128;
int g_nCoreSize = 1; 
int g_nElementShape = MORPH_RECT;
static void on_AdaptiveMethod(int, void *)
{
///对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。
if (g_nAdaptiveMethod == 0)
adaptiveThreshold(srcImage, dstImage1, 255, g_nAdaptiveMethod, THRESH_BINARY, (g_nBlocksize+1) * 2 + 1, 7);
else 
//对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1。
adaptiveThreshold(srcImage, dstImage1, 255, g_nAdaptiveMethod, THRESH_BINARY, (g_nBlocksize+1) * 2 + 1, 7);
imshow("自适应阈值", dstImage1);
}
static void on_Blocksize(int, void *)
{
adaptiveThreshold(srcImage, dstImage1, 255, g_nAdaptiveMethod, THRESH_BINARY, (g_nBlocksize+1) * 2 + 1, 7);
imshow("自适应阈值", dstImage1);
}
static void on_Binary(int, void *)
{
int rowNum = srcImage.rows;
int colNum = srcImage.cols * srcImage.channels();
for (int i = 0; i < rowNum; ++i)
{
uchar *src = srcImage.ptr<uchar>(i);
uchar *dst = dstImage2.ptr<uchar>(i);
for (int j = 0; j < colNum; ++j)
{
dst[j] = src[j]> g_nBinary ? 225 : 0;
}
}


threshold(srcImage, dstImage2, g_nBinary, 255, THRESH_BINARY);
imshow("二值化阈值", dstImage2);
}
static void on_coresize(int, void *)
{
Mat element;
if (g_nElementShape == 0)
{
element = getStructuringElement(MORPH_RECT, Size(2 * g_nCoreSize + 1, 2 * g_nCoreSize + 1),
Point(g_nCoreSize, g_nCoreSize));
}
else if (g_nElementShape == 1)
{
element = getStructuringElement(MORPH_CROSS, Size(2 * g_nCoreSize + 1, 2 * g_nCoreSize + 1),
Point(g_nCoreSize, g_nCoreSize));
}
else
{
element = getStructuringElement(MORPH_ELLIPSE, Size(2 * g_nCoreSize + 1, 2 * g_nCoreSize + 1),
Point(g_nCoreSize, g_nCoreSize));
}
morphologyEx(srcImage, dstImage3, MORPH_GRADIENT, element);
imshow("形态学梯度", dstImage3);
}


int main()
{
srcImage = imread("D:\\picture\\picture9\\2.tif",0);
imshow("原图", srcImage);
namedWindow("自适应阈值", WINDOW_AUTOSIZE);
createTrackbar("算法", "自适应阈值", &g_nAdaptiveMethod, 1, on_AdaptiveMethod);
createTrackbar("bloksize", "自适应阈值", &g_nBlocksize, 20, on_Blocksize);
on_AdaptiveMethod(g_nAdaptiveMethod, 0);
on_Blocksize(g_nBlocksize, 0);
srcImage.copyTo(dstImage2);
dstImage2.create(srcImage.size(), srcImage.type());
namedWindow("二值化阈值",WINDOW_AUTOSIZE);
createTrackbar("阈值", "二值化阈值", &g_nBinary,255,on_Binary);
//-----------------------------------------------
图像分割 利用蒙板去扣图
Mat maskImage,cannyImage,dst_iamge;
maskImage.create(srcImage.size(), CV_8UC1);
maskImage = Scalar::all(0);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
Canny(srcImage, cannyImage, 50, 150, 3);
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(cannyImage, cannyImage, MORPH_DILATE, element);
findContours(cannyImage, contours,hierarchy, RETR_CCOMP, CHAIN_APPROX_NONE);
for (int i = 0; i < contours.size(); ++i)
{
drawContours(maskImage, contours, i, Scalar(255), CV_FILLED, 8, hierarchy);
}
srcImage.copyTo(dst_iamge, maskImage);
imshow("最终效果图",dst_iamge);
//------------------------------------------------
on_Binary(g_nBinary, 0);
namedWindow("形态学梯度", WINDOW_AUTOSIZE);
createTrackbar("内核尺寸", "形态学梯度", &g_nCoreSize, 10, on_coresize);
createTrackbar("内核形状", "形态学梯度", &g_nElementShape, 2, on_coresize);
on_coresize(1, 0);
while (1)
{
char c = waitKey(0);
if (c == 27)
break;
}


return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值