我有底部半圆左上角的坐标,我知道半圆的长度和宽度是如何被包围在一个矩形中的。我想要做的是将底部半圆翻译成4个像素。那么有人可以提供一些代码来翻译一段知道所有坐标的图像吗?感谢。
答案 0 :(得分:1)
感谢@Rachel L的帮助,但我刚才想出来了。基本上我在底部创建了一个包含半圆的单独图像,并且我使用了一种方法来获取底部每个半圆的左上角。然后我想出了半圆的长度和宽度,然后移动了我创建的5个单位的所有黑色像素,这些单位对齐了它。
我可能应该补充说,这是一个更大的项目的一部分,我需要从这个图像移动底部的所有半圆,以便它们全部对齐意味着我不知道它们的坐标。
提取半圆位置的方法
def extract(name1, name2):
img_rgb = cv2.imread(name1)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread(name2,0)
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
arr = []
for pt in zip(*loc[::-1]):
if "down" in name2:
pt = (pt[0], pt[1] + 1)
arr.append(pt)
return arr
向上移动半圆的代码
locFillSemiDown = extract('img' + str(num) + '.png', 'filledsemidown.png')
for loc in locSemiDown:
for y in range(loc[0], loc[0] + 11):
for x in range(loc[1], loc[1] + 6):
if(img.item(x,y,0) == 0 and img.item(x,y,1) == 0 and img.item(x,y,2) == 0):
img.itemset((x - 5, y,0),0)
img.itemset((x - 5, y,1),0)
img.itemset((x - 5, y,2),0)
img.itemset((x, y,0),0)
img.itemset((x, y,1),255)
img.itemset((x, y,2),255)
答案 1 :(得分:0)
对于该特定图像,您可以通过抓取矩形加上4-6像素行,然后将该ROI放在图像上高出所需的4个像素。
这是在C ++中,但它应该足够相似,你可以翻译它。
#include "stdafx.h"
#include <opencv/cxcore.h>
#include <opencv2\core\mat.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv/cxcore.h>
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
using namespace std;
int main() {
//getting the image
Mat image = imread("C:/this/is/a/link/to/an/image.png");
//create new image that looks exactly like old image
Mat new_image = image.clone();
//showing the image
namedWindow("Image", CV_WINDOW_NORMAL| CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED);
imshow("Image", image);
waitKey(0);
//getting the roi coordinates
int x = 13, y = 8; //eyeballing the coordinates
int w = 26-x, h = 20-y; //more eyeballing the coordinates
//grabbing the roi
Rect roi = Rect(x, y, w, h);
Mat img_roi = image(roi);
//creating the new roi
Rect new_roi = Rect(x, y-4, w, h);
//copying the old roi onto the new image in the space of the new roi
img_roi.copyTo(new_image(new_roi));
//displaying the image
imshow("Image", new_image);
waitKey(0);
//saving the new image
imwrite("C:/this/is/a/link/to/a/newimage.png", new_image);
}
结果如下:
现在,这是有效的,因为你可以获得更多的黄色,你可以抓住你正在寻找的矩形下方。
如果你将它修剪成你想要移动的矩形,那么它只是将旧图像上的roi覆盖,并且你最终将部分移动到#34;移动&#34;图像在哪里。
像这样: