<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def focus(self, height, width, center_i=None, center_j=None):
 """Zero out all of the image outside of a crop box. Parameters height : int The height of the desired crop box. width : int The width of the desired crop box. center_i : int The center height point of the crop box. If not specified, the center of the image is used. center_j : int The center width point of the crop box. If not specified, the center of the image is used. Returns ------- :obj:`Image` A new Image of the same type and size that is zeroed out except within the crop box. """

        if center_i is None:
            center_i = self.height / 2
        if center_j is None:
            center_j = self.width / 2

        start_row = int(max(0, center_i - height / 2))
        end_row = int(min(self.height - 1, center_i + height / 2))
        start_col = int(max(0, center_j - width / 2))
        end_col = int(min(self.width - 1, center_j + width / 2))

        focus_data = np.zeros(self._data.shape)
        focus_data[start_row:end_row + 1, start_col:end_col + \
            1] = self._data[start_row:end_row + 1, start_col:end_col + 1]
        return type(self)(focus_data.astype(self._data.dtype), self._frame)