突出显示具有不同颜色图像的区域及其周围的区域
Posted
技术标签:
【中文标题】突出显示具有不同颜色图像的区域及其周围的区域【英文标题】:Highlight areas with different colour image with the area that surround them 【发布时间】:2020-05-25 22:00:04 【问题描述】:我刚刚开始使用计算机视觉和 OpenCV。
我正在处理 MRI 大脑图像,我想知道是否有过滤器或其他东西可以让我分割我在这张图像上用红色标记的区域:
这是原图:
是的,我知道有很多深度学习解决方案可以分割这种网络,但我想知道,因为我是新手,是否有过滤器可以突出显示我所包围的这些区域。
问题是:
是否有过滤器或其他东西可以突出显示我包围的区域?
这就是我想要的:
【问题讨论】:
您希望结果如何? @MarkSetchell 我不知道。也许我要删除这个问题。对不起,我是这个领域的新手,我还没有找到任何有用的东西(可能是因为我不知道如何搜索它)。我添加了一张新图片,显示了我想要得到的东西。 你可以用 "flood-fill" 做到这一点。看看这里的例子......***.com/a/60044007/2836621 【参考方案1】:观察到您要提取的部分具有特定颜色,我们可以使用颜色阈值来隔离对象。您没有指定语言,所以我将使用 Python 进行演示。这个想法是使用cv2.inRange()
确定颜色阈值的下限/上限颜色范围。我们将图像转换为 HSV 格式,然后使用此范围生成二进制分段掩码
lower = np.array([0, 0, 118])
upper = np.array([179, 255, 202])
import numpy as np
import cv2
# Color threshold
image = cv2.imread('1.png')
original = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 118])
upper = np.array([179, 255, 202])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(original,original,mask=mask)
cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.imshow('original', original)
cv2.waitKey()
您可以将此颜色阈值脚本与轨迹栏一起使用来微调上下颜色范围
import cv2
import numpy as np
def nothing(x):
pass
# Load image
image = cv2.imread('1.png')
# Create a window
cv2.namedWindow('image')
# Create trackbars for color change
# Hue is from 0-179 for Opencv
cv2.createTrackbar('HMin', 'image', 0, 179, nothing)
cv2.createTrackbar('SMin', 'image', 0, 255, nothing)
cv2.createTrackbar('VMin', 'image', 0, 255, nothing)
cv2.createTrackbar('HMax', 'image', 0, 179, nothing)
cv2.createTrackbar('SMax', 'image', 0, 255, nothing)
cv2.createTrackbar('VMax', 'image', 0, 255, nothing)
# Set default value for Max HSV trackbars
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)
# Initialize HSV min/max values
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0
while(1):
# Get current positions of all trackbars
hMin = cv2.getTrackbarPos('HMin', 'image')
sMin = cv2.getTrackbarPos('SMin', 'image')
vMin = cv2.getTrackbarPos('VMin', 'image')
hMax = cv2.getTrackbarPos('HMax', 'image')
sMax = cv2.getTrackbarPos('SMax', 'image')
vMax = cv2.getTrackbarPos('VMax', 'image')
# Set minimum and maximum HSV values to display
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# Convert to HSV format and color threshold
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(image, image, mask=mask)
# Print if there is a change in HSV value
if((phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
phMin = hMin
psMin = sMin
pvMin = vMin
phMax = hMax
psMax = sMax
pvMax = vMax
# Display result image
cv2.imshow('image', result)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
【讨论】:
非常感谢您的澄清。这就是我需要的。【参考方案2】:这是我的简单方法,但它可能会有所帮助。最后想要得到的部分有色差。我尝试使用它。我只是专注于图像的中心。我手动选择了裁剪区域,但您可以尝试通过参考中间的两个黑色区域来获得它。
这是我的简单代码:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
Mat img = imread("/ur/image/directory/image.png",CV_LOAD_IMAGE_GRAYSCALE);
imshow("Source",img);
for(int i=160;i<460;i++)
for(int j=130;j<460;j++)
if(img.at<uchar>(Point(j,i))<120)
img.at<uchar>(Point(j,i)) = 0;
imshow("Result",img);
waitKey(0);
return 0;
这是结果图片:
【讨论】:
非常感谢。我只需要开始。【参考方案3】:做一些简单的门槛,你可以取得一些好的结果。然后,您可以选择感兴趣的区域以更密切地关注感兴趣的区域并移除双桨伪影。
这是我用于此的代码:
/// Global Variables
const int alpha_slider_max = 255;
int alpha_slider;
int alpha_slider2;
cv::Mat image, gray;
void on_trackbar(int, void*)
cv::Mat dst1, dst2, result;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, dst1, alpha_slider, 255, cv::THRESH_BINARY_INV);
gray.copyTo(dst2, dst1);
cv::imshow("partial1", dst2);
cv::threshold(dst2, dst2, alpha_slider2, 255, cv::THRESH_BINARY);
cv::imshow("threshold", dst2);
int main()
image = cv::imread("Brain.png");
cv::namedWindow("threshold", 1);
cv::createTrackbar("trakbar", "threshold", &alpha_slider, alpha_slider_max, on_trackbar);
cv::createTrackbar("trakbar2", "threshold", &alpha_slider2, alpha_slider_max, on_trackbar);
cv::imshow("original", image);
while (cv::waitKey(10) != 'q');
【讨论】:
非常感谢。我只需要开始。以上是关于突出显示具有不同颜色图像的区域及其周围的区域的主要内容,如果未能解决你的问题,请参考以下文章